Объединение тысяч текстовых файлов в сотнях каталогов (при сохранении некоторой структуры) - PullRequest
1 голос
/ 16 ноября 2011

У меня есть набор текстовых файлов, распределенных по 400+ каталогам, с тоннами и тоннами подкаталогов.Есть около 300 000 текстовых файлов.Например:

directory1/subdirectory1
directory1/subdirectory2
directory1/subdirectory1/subdirectory3

Все эти текстовые файлы в directory1 должны заканчиваться в одном большом текстовом файле с именем directory1.txt.Затем повторите с directory2.

Какой самый быстрый и простой способ войти в каждую из этих четырех сотен каталогов и объединить все текстовые файлы таким образом?

Я знаю, что могу перейти к каждому из четырех сотен каталогов и использовать такие команды, как find, чтобы собрать все текстовые файлы в один каталог, а затем использовать cat *.txt >> all.txt, но, безусловно,простой способ автоматизировать этот процесс?

Ответы [ 3 ]

4 голосов
/ 16 ноября 2011

Чтобы объединить все txt-файлы в поддереве:

#!/bin/sh
# Usage: cat-txt dirname
find "$1" -name \*.txt -print0 | xargs -0 cat >> "$1.txt"

Звоните cat-txt по всем непосредственным подкаталогам:

$ find -mindepth 1 -maxdepth 1 -type d -exec cat-txt '{}' \;
1 голос
/ 16 ноября 2011

Я проверил это на моей системе, и она работает безупречно. Вы можете настроить его под свои параметры, но в одной строке я сделал все, что вам нужно.

for I in `ls -dR */`; do cat $I/* > $I.txt; done

Вы можете изменить команду ls на поиск только текстовых файлов, в противном случае вы также получите двоичные данные. Наслаждайтесь.

for I in `ls -dR */*.txt`; do cat $I/* > $I.txt; done
1 голос
/ 16 ноября 2011

должен быть простой способ автоматизировать этот процесс?

Почему ты ищешь? Это одноразовое занятие или ты будешь повторять его время от времени?

Я бы просто сказал пойти с чем-то простым:

for ff in `find . -maxdepth 1 -type d`
do
    find "$ff" -type *.txt -exec cat {} \; >> "$ff.txt"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...