Вопрос скрипт для конкатенации нескольких текстовых файлов, найденных в zip-архивах, вложенных в несколько папок


У меня есть 30-гигабайт текстовых файлов и html-файлов из разных источников, лежащих в иерархии вложенных папок. Все эти папки находятся в моем домашнем каталоге в папке с именем zipFiles. Иерархия на 20 уровней глубокая - некоторые ветви глубже других. Я хочу объединить текст ВСЕХ этих файлов в один огромный текстовый файл, который будет использоваться как RDD в проекте Spark. Очевидно, мне нужно было бы преобразовать html-файлы в текст, удалив также коды форматирования html.

Мой подход: итерации через иерархию вложенных папок (не знаю, как это сделать в bash) разархивировать файл если это html конвертировать его в текст добавьте его в ОГРОМНЫЙ результат

Проблемы, которые я вижу с этим, заканчиваются из ram, если я все это делаю в памяти, просто добавив текст в переменную в коде.

Если я открою HUGE-файл с диска, напишите ему и закройте файл, затем я обмотаю диск, и он также будет медленно.

Является ли bash сценарием моего единственного решения, потому что это пугает меня. Я думаю, я мог бы сделать это на python, но тогда мне нужно знать, как распаковывать в python и делать html для преобразования текста.


3
2018-02-14 18:03


происхождения


Так есть ли один огромный архив с большим количеством файлов в нем или есть несколько архивов с несколькими файлами в нем? Или есть много архивов с одним файлом в каждом? Какой тип архива вы используете (tar.gz, zip, ...)? Существуют ли только текстовые / HTML-файлы или другие типы? Если да, можем ли мы различать их по именам файлов (используйте только .txt, .htm, .html)? Было бы неплохо, если бы вы где-то загрузили некоторые данные. - Byte Commander
Просьба уточнить: какие входные файлы у вас есть? ZIP-архивы, содержащие HTML и текстовые файлы? Какой результат вам нужен? Вам нужно добавить его в свой «RDD в проекте Spark» все в одном BIG-компе, или вы можете добавить его в несколько кусков меньшего размера? - waltinator
извините за неясность. Существует иерархия папок: - aquagremlin
folder1 имеет папки a, b, c, d, e, f. В папке a есть папки альфа, бета, гамма. Папка alpha имеет file1.zip, file2.zip. Папка b имеет папки тета и дзета. У файла есть файлы1.zip ....... file1000.zip. Папка C имеет папку1 ...... folder500 в ней - и каждый из них имеет от 10 до 20 ZIP-файлов. Некоторые zip-файлы содержат несколько текстовых файлов. Некоторые zip-файлы имеют html и jpg-файлы. Я хотел бы добавить данные в виде одного ОГРОМНОГО текстового файла. - aquagremlin


ответы:


find является хорошим инструментом, когда вам нужно что-то рекурсивно делать в каталогах. zcat может

Мой подход будет примерно таким:

find /home/username/zipFiles -type f -name "*.zip" -exec zcat {} \; > outputfile.txt

Пример:

$ df > testfile.txt                                            
$ zip testArchive testfile.txt
  adding: testfile.txt (deflated 54%)
$ find . -maxdepth 1 -name "*.zip" -exec zcat {} \;            
Filesystem     1K-blocks     Used Available Use% Mounted on
udev             1954212        4   1954208   1% /dev
tmpfs             393160     3392    389768   1% /run
/dev/sda1      115247656 82424300  26946008  76% /
none                   4        0         4   0% /sys/fs/cgroup
none                5120        0      5120   0% /run/lock
none             1965792       80   1965712   1% /run/shm
none              102400       32    102368   1% /run/user
cgmfs                100        0       100   0% /run/cgmanager/fs
/dev/sdb1       30343056       48  30343008   1% /media/xieerqi/SDCZ43-032G

2
2018-02-15 23:53



в качестве теста я попробовал это в папке с только одним zip-файлом, и выход был пуст ........... find. -type f -name ".zip "-exec zcat {} /.текст \; > outputfile.txt - aquagremlin
@aquagremlin вы искали ".zip" файл, названный точно .zip, Посмотрите на мой ответ - вам нужно включить "*.zip" - Sergiy Kolodyazhnyy
Ах, мое плохое - я включил {}/*.txt часть. zcat не нуждается в /*.txt часть. Фиксация этого - Sergiy Kolodyazhnyy