Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Извлечение файлов  (Прочитано 5385 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн RIS

  • Автор темы
  • Активист
  • *
  • Сообщений: 303
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #30 : 23 Марта 2019, 20:24:20 »
Если путь "/media/aik/1036BD7336BD5A84/Users/AIK/AppData/Roaming/Thunderbird/Profiles/3w24huea.default/Mail/pop.yandex.com/Inbox/cur" слишком длинный, тогда перемещаю файлы с Windows 10 на Ubuntu 18.04 и запускаю команду повторно.

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #31 : 23 Марта 2019, 20:34:03 »
файлы
Я бы сперва попробовал один из файлов. Научиться пользоваться описанным мною алгоритмом. Убедились что все работает с одним-двумя файлами - тогда уже можно и весь массив алгоритму скармливать...
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн RIS

  • Автор темы
  • Активист
  • *
  • Сообщений: 303
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #32 : 23 Марта 2019, 20:45:18 »
После запуска команды aik@Laptop:~$ mypath="$HOME/eml/"
aik@Laptop:~$ find $mypath -type f -regextype posix-egrep -regex ".*/[0-9]*" -exec ripmime -i {} -d {}.files \;
aik@Laptop:~$ find $mypath -type f -regextype posix-egrep -regex  ".*(xls|xlsx)$" -exec cp {} $HOME/Downloads/ \;
aik@Laptop:~$ find $mypath -type d -name "*.files" -exec rm -rf {} \;
find: ‘/home/aik/eml/6939061820437369.files’: No such file or directory
find: ‘/home/aik/eml/6514253442910260.files’: No such file or directory
find: ‘/home/aik/eml/8825418211216863.files’: No such file or directory
aik@Laptop:~$ ls $HOME/Downloads
получил 3 xlsx файла.

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #33 : 24 Марта 2019, 04:08:17 »
получил 3 xlsx файла.
Следовательно, исходная парадигма работает. Остается исключить ту самую заминку с именем файла. Как вариант давайте попробуем отработать через вспомогательную символьную ссылку. Длинный путь
/media/aik/1036BD7336BD5A84/Users/AIK/AppData/Roaming/Thunderbird/Profiles/3w24huea.default/Mail/pop.yandex.com/Inbox/cur
заменим своего рода "ярлыком" в домашней папке текущего пользователя. Для этой "махинации" нам потребуется прибегнуть к встроенной утилите ln. В данном случае назовем символьную ссылку "myEML":ln -s /media/aik/1036BD7336BD5A84/Users/AIK/AppData/Roaming/Thunderbird/Profiles/3w24huea.default/Mail/pop.yandex.com/Inbox/cur /home/aik/myEMLПосле этого выполните в терминале команду ls -l /home/aik/myEMLОтвет должен показать на что ссылается данный "ярлык". Если конечная папка вписана корректно (а я скопировал Ваш ввод, не проверяя его по представленным ранее скриншотам), то символьная ссылка у нас получилась. Тогда пробуем искать файлы (ключ L стал необходим, поскольку мы полезли в символьные ссылки):find -L ~/myEML -type f -regextype posix-egrep -regex ".*/[0-9]*"Если в ответ посыпались полные имена файлов списком, то пока все хорошо, и можно идти дальше. Вводим:find -L ~/myEML -type f -regextype posix-egrep -regex ".*/[0-9]*" -exec ripmime -i {} -d {}.files \;
find -L ~/myEML -type f -regextype posix-egrep -regex  ".*(xls|xlsx)$" -exec cp {} ~/Downloads/ \;
find -L ~/myEML -type d -name "*.files" -exec rm -rf {} \; 2>/dev/null
Добавил к последней команде перенаправление ошибок, чтобы Вас не смущал вывод вида "нет такого файла или каталога".
В сущности: Вас действительно интересуют только вложения вида "*.xls" и "*.xlsx"? Если нет, - то может следует попробовать более простой способ? Каталог-приемник у нас один и тот же. Нам интересно в нем увидеть все вложения со всех наших файлов EML. Тогда хватит по идее выполнить (с примененной ранее символьной ссылкой):
find -L ~/myEML -type f -regextype posix-egrep -regex ".*/[0-9]*" -exec ripmime -i {} -d ~/Downloads/ \;
find ~/Downloads -type f -name "textfile*" -exec rm {} \;
Вторая команда позволит уничтожить многочисленные файлы вида textfile, textfile1, textfile1_1, ... не несущие в себе навскидку никакой полезной информации.
Символьную ссылку после всех манипуляций можно с чистой совестью из папки пользователя удалить - в ней более нет необходимости. Для присланных Вами ранее файлов в этом случае получаю:
(Нажмите, чтобы показать/скрыть)


Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн RIS

  • Автор темы
  • Активист
  • *
  • Сообщений: 303
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #34 : 24 Марта 2019, 10:45:10 »
Спасибо за подробную консультацию, при попытке обработке файлов с раздела Windows предыдущая ошибка в кодировке повторяется, решил скопировать cp -R /media/aik/1036BD7336BD5A84/Users/AIK/AppData/Roaming/Thunderbird/Profiles/3w24huea.default/Mail/pop.yandex.com/Inbox/cur "$HOME/Downloads" все файлы на раздел Ubuntu и далее обработать их.

Оффлайн RIS

  • Автор темы
  • Активист
  • *
  • Сообщений: 303
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #35 : 25 Марта 2019, 23:08:41 »
Перенес файлы eml на раздел Ubuntu, каталог весит 100 Gb, запустил команду find -L /home/aik/snap/thunderbird/common/.thunderbird/ccv00u5b.default/Mail/pop.yandex.com/Inbox/cur -type f -regextype posix-egrep -regex ".*/[0-9]*" -exec ripmime -i {} -d {}.files \;
find -L /home/aik/snap/thunderbird/common/.thunderbird/ccv00u5b.default/Mail/pop.yandex.com/Inbox/cur -type f -regextype posix-egrep -regex  ".*(xls|xlsx)$" -exec cp {} /home/aik/Downloads/ \;
find -L /home/aik/snap/thunderbird/common/.thunderbird/ccv00u5b.default/Mail/pop.yandex.com/Inbox/cur -type d -name "*.files" -exec rm -rf {} \; 2>/dev/null
и заметил что скрипт для каждого файла eml распаковывает файл eml в папку с файлами которые находятся в файле eml, по завершению процесса так понимаю что начнется перенесение xlsx файлов, однако у меня нету еще свободных 100 Gb на диске для временных распакованных файлов (xlsx файлы итого занимают 3 Gb, дело в том что там есть много фото которые весят остальные 97 Gb), можно добавить в команду задачу что бы это было последовательно:

1) распаковка файла eml в папку с файлами
2) перенесение xlsx файлы из распакованную папку
3) удаление распакованной папки

?
« Последнее редактирование: 25 Марта 2019, 23:12:58 от RIS »

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #36 : 26 Марта 2019, 09:59:00 »
1) распаковка файла eml в папку с файлами
2) перенесение xlsx файлы из распакованную папку
3) удаление распакованной папки
В чистом виде через find я однострочником это не смогу написать, - сколь я ни пробовал, не получается у меня организовать последовательность действий над найденными файлами в одну строку. Однако в качестве обходного варианта могу предложить применение вспомогательного скрипта. Скрипт будет выполнять действия по описанному алгоритму: на вход даем имя файла (EML), и имя папки, куда содержимое складировать. Скрипт распаковывает содержимое EML в буферную папку, вытаскивает из буферной папки все файлы XLSX в нашу целевую папку, а буферную папку очищает.
Если на словах все устраивает - приступаем к реализации. Понадобится только определиться:
Допущение 1: используемый текстовый редактор: в штатной версии Ubuntu 16.04 - 18.04 текстовым редактором является gedit. Его я и буду применять далее по тексту. Если у Вас в системе используется другой - подставьте его имя (это может быть leafpad, kate, pluma, ... - в зависимости от DE в установленной у Вас системе).
Допущение 2. Местоположение файлов EML. Исхожу из Вашего ответа #36, и подставляю везде продемонстрированное там/home/aik/snap/thunderbird/common/.thunderbird/ccv00u5b.default/Mail/pop.yandex.com/Inbox/cur/Если это не верный путь - подставляйте то, что у Вас по факту (где лежат файлы EML) далее по тексту вместо этой строки.
Словом, поехали.
1. Открываем терминал (Ctrl+Alt+T), выполняем в нем команду: gedit ~/unpackEMLПоявляется окно текстового редактора без какого-либо текста в нем. Это наш пустой файл unpackEML, находящийся в домашней папке текущего пользователя. Вводим в это окно такой код:
Код: (bash) [Выделить]
#!/bin/bash
curEML="$1"     #принимаем имя текущего файла EML из первого параметра для скрипта
outerDir="$2"   #принимаем имя директории, куда сохранять файлы XLSX из второго параметра скрипта
bufDir="$HOME/buf"
#Проверяем факт существования конечной директории (создаем, если нет):
if [ ! -d "$outerDir" ]; then mkdir -p "$outerDir"; fi
#Проверяем факт существования буферной директории (создаем, если нет):
if [ ! -d "$bufDir" ]; then mkdir -p "$bufDir"; fi
#распаковываем текущий файл в буферную директорию
ripmime -i "$curEML" -d "$bufDir"
#копируем из буферной директории в выходную директорию файлы *.xlsx (игнорируя регистр)
find "$bufDir" -type f -iname  "*.xlsx" -exec cp {} "$outerDir" \;
#вычищаем буферную директорию:
rm  "$bufDir/"*
(Нажмите, чтобы показать/скрыть)
Сохраняем внесенные изменения. Закрываем окно gedit (или нашего текущего текстового редактора, если применяли что-то иное). Окно терминала не закрываем - продолжаем "командовать"...
2. Делаем скрипт исполняемым. Для этого выполняем команду: chmod +x ~/unpackEML3. Запускаем данный скрипт на каком-нибудь одном файле для проверки:~/unpackEML /home/aik/snap/thunderbird/common/.thunderbird/ccv00u5b.default/Mail/pop.yandex.com/Inbox/cur/1553284572596000 ~/XLSX_Downloads
ls ~/XLSX_Downloads
Последняя нам покажет:'Жалилов Б.М (собственник и страхователь Снегур Т.А.) авто 2_ КЦ 4 детализация.xlsx'
'Жалилов Б.М (собственник и страхователь Снегур Т.А.) авто 2_Лист Доставки КЦ4.xlsx'
4. Если до сих пор все правильно - можно организовать циклический перебор с помощью того же find, который применяли до сих пор, только вызываем параметром exec наш свежесозданный и протестированный скрипт: find -L /home/aik/snap/thunderbird/common/.thunderbird/ccv00u5b.default/Mail/pop.yandex.com/Inbox/cur -type f -regextype posix-egrep -regex ".*/[0-9]*" -exec ~/unpackEML {} ~/Downloads \;Теоретически, как мне кажется, с таким подходом можно даже из исходного каталога на разделе Windows выполнять "распаковку", - буферная папка теперь находится в домашней папке пользователя, а значит ошибка кодировок не должна беспокоить. Сама буферная папка после выполнения последней команды из папки пользователя не удаляется.
« Последнее редактирование: 26 Марта 2019, 16:07:16 от zg_nico »
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн RIS

  • Автор темы
  • Активист
  • *
  • Сообщений: 303
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #37 : 26 Марта 2019, 11:31:19 »
До этого все сделал и работает, но при выполнение команды find -L /home/aik/snap/thunderbird/common/.thunderbird/ccv00u5b.default/Mail/pop.yandex.com/Inbox/cur -type f -regextype posix-egrep -regex ".*/[0-9]*" ~/unpackEML {} ~/Downloads \; rm -rf ~/buf получаю ошибку find: paths must precede expression: `/home/aik/unpackEML'
find: possible unquoted pattern after predicate `-regex'?

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #38 : 26 Марта 2019, 16:07:58 »
получаю ошибку
Извиняюсь. Я в последней команде забыл указать "-exec", потому и ошибка. Команду исправил. Вот верная:
find -L _ПУТЬ_ -type f -regextype posix-egrep -regex ".*/[0-9]*" -exec ~/unpackEML {} ~/Downloads \;
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн RIS

  • Автор темы
  • Активист
  • *
  • Сообщений: 303
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #39 : 28 Марта 2019, 12:47:45 »
Спасибо, получилось, задача решена.
Интересно, с помощью командной строки можно из полученных файлов xlsx извлекать номера телефонов в отдельном TXT файле?

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #40 : 29 Марта 2019, 04:28:50 »
с помощью командной строки можно из полученных файлов xlsx извлекать номера телефонов
В рамках исходных файлов можно таким способом. Потребуется (для скорости, т.к. для конвертирования в тот же csv достаточно было бы и libreoffice calc, но он запускается долго, а запускаться он будет для каждого файла - Вы там часами будете ждать выполнения для своих 100к файлов; плюс возня с кодировкой будет на выходе скорее всего) утилита, которая умеет читать xlsx и выдавать ответ на терминал. Применим для этих целей xlsx2csv sudo apt install xlsx2csvИсхожу из того, что у нас файлы все называются "*.xlsx" в любом регистре и лежат в каталоге ~/Downloads. Тогда можно заставить find напечатать нам либо номера телефонов по маске, применив egrep: find ~/Downloads -type f -iname "*.xlsx" -exec bash -c 'xlsx2csv "{}" | egrep "[0-9]{3}\ [0-9]{3}\ [0-9]{2}\ [0-9]{2}"' \;В результате получим нечто вроде:Контактный телефон:,,,966 189 83 63,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Контактный телефон:,,,925 222 54 75,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Контактный телефон:,,,929 562 06 90,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Либо напрямую воспользоваться тем, что файлы у нас все организованы как учетные карточки. Тогда можно искать напрямую по имени поля "Контактный телефон":find ~/Downloads -type f -iname "*.xlsx" -exec bash -c 'xlsx2csv "{}" | grep "Контактный телефон"' \;Результат тот же, но для понимания проще. Сами по себе телефоны вряд ли имеют особое значение, но можно дать параметр для вывода следующей после найденной строки (-A1):find ~/Downloads -type f -iname "*.xlsx" -exec bash -c 'xlsx2csv "{}" | grep "Контактный телефон" -A1' \;Получается интересней: уже есть имя Получателя, а не голый номер телефона. Остается побороть лишние знаки запятых [с этим просто - указываем ключ -d с желаемым разделителем для xlsx2csv], и модернизировать вывод для удобочитаемости [с этой целью можно искать уже по именам полей "Контактный телефон" и "Получатель"]. Это можно реализовать, например, так:find ~/Downloads -type f -iname "*.xlsx" -exec bash -c 'pol=`xlsx2csv -d "" "{}" | grep "Получатель"`; num=`xlsx2csv -d "" "{}" | grep "Контактный телефон"`; echo -e "$pol\n$num"' \;Результат в последнем случае будет таким:Получатель:                     Харитонова Анжелика Николаевна
Контактный телефон:                     966 189 83 63
Получатель:                     Шашкин Александр Игоревич
Контактный телефон:                     925 222 54 75
Получатель:                     Старков Никита Валентинович
Контактный телефон:                     929 562 06 90
Перенаправление вывода в файл:find ~/Downloads -type f -iname "*.xlsx" -exec bash -c 'pol=`xlsx2csv -d "" "{}" | grep "Получатель"`; num=`xlsx2csv -d "" "{}" | grep "Контактный телефон"`; echo -e "$pol\n$num"' \; > ~/contacts.txtВозиться с табуляцией в консоли нет желания - обработайте конечный файл в текстовом редакторе (автозамену никто не отменял, как говорится). Нужно будет удалить табуляцию (управляющая последовательность \t заменить на пустую строку) и добавить пробел после ":" для удобочитаемости (заменить символ ":" на вхождение вида ": "). Результат:Получатель: Харитонова Анжелика Николаевна
Контактный телефон: 966 189 83 63
Получатель: Шашкин Александр Игоревич
Контактный телефон: 925 222 54 75
Получатель: Старков Никита Валентинович
Контактный телефон: 929 562 06 90
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн RIS

  • Автор темы
  • Активист
  • *
  • Сообщений: 303
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #41 : 29 Марта 2019, 21:05:07 »
В целях ускорения процесса парсинга, нужно оставить на парсинг только ячейку "Контактный телефон" и исключать "Получатель" так как номера оыбчно идентичны, помогите редактировать команду find ~/XLSX -type f -iname "*.xlsx" -exec bash -c 'pol=`xlsx2csv -d "" "{}" | grep "Получатель"`; num=`xlsx2csv -d "" "{}" | grep "Контактный телефон"`; echo -e "$pol\n$num"' \; > ~/contacts.txt

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #42 : 29 Марта 2019, 21:26:22 »
нужно оставить на парсинг только ячейку "Контактный телефон" и исключать "Получатель"
Команда:find ~/Downloads -type f -iname "*.xlsx" -exec bash -c 'xlsx2csv -d "" "{}" | grep "Контактный телефон"' \; > ~/contacts.txtПроверить на момент не могу - пишу с телефона.
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #43 : 31 Марта 2019, 07:17:47 »
RIS, изыскания закончены? :)
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн RIS

  • Автор темы
  • Активист
  • *
  • Сообщений: 303
    • Просмотр профиля
Re: Извлечение файлов
« Ответ #44 : 31 Марта 2019, 22:39:43 »
В понедельник смогу закончить задачу и обязательно сообщу о результате.

Пользователь добавил сообщение 01 Апреля 2019, 12:48:38:
Получилось систематизировать базу, спасибо.
« Последнее редактирование: 01 Апреля 2019, 12:48:38 от RIS »

 

Страница сгенерирована за 0.053 секунд. Запросов: 25.