Как объединить файлы из разных подкаталогов?

Как объединить файлы из разных подкаталогов?

У меня есть большая папка, содержащая много подкаталогов, каждый из которых содержит много .txtфайлов. Я хочу объединить все эти файлы в один .txtфайл. Я могу сделать это для каждого из подкаталогов с помощью cat *.txt>merged.txt, но я пытаюсь сделать это для всех файлов в большой папке. Как мне это сделать?

решение1

попробуйте с

find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile

fрекурсивно найти все файлы «*.txt» /path/to/sourceв подкаталогах и объединить все в один mergedfile.

Чтобы объединить файлы каждого подкаталога в его каталоге, выполните:

find . -mindepth 1 -type d -execdir sh -c 'cat $1/*.txt >> $1/mergedfile' _ {} \;

решение2

Если вы используете Bash и количество текстовых файлов ограничено (т.е. не превышает максимального предела числа аргументов, который очень велик, но не бесконечен), вы можете легко добиться этого с помощью функции globstar:

$ shopt -s globstar
$ cat **/*.txt > merged.txt

Более общий, хотя и менее элегантный подход — использовать findдрайвер и заставить его вызывать catкаждый файл, добавляя вывод:

$ find -name \*.txt -exec sh -c 'cat {} >> merged.out' \;

Вызов shздесь необходим, поскольку вы хотите добавить результат каждого cat. Убедитесь, что выходной файл имеет другое расширение или находится за пределами дерева, которое вы объединяете, или findможете попытаться объединить вывод с самим собой.

решение3

Если вам необходимо выполнить объединение в определенном порядке, то нижеприведенная команда объединит файлы в лексикографическом порядке (сортируя по именам путей) в bash:

shopt -s globstar
for name in **/*.txt; do
    [ -f "$name" ] && cat <"$name"
done >merged.out

Это похоже на findкоманду

find  . -type f -name '*.txt' -exec cat {} ';' >merged.out

за исключением того, что порядок может быть другим, символические ссылки на обычные файлы будут включены (добавьте , && [ ! -L "$name" ]если они вам не нужны), а скрытые файлы (и файлы в скрытых каталогах) будут исключены (используйте , shopt -s dotglobчтобы добавить их обратно).

Связанный контент