Объединение нескольких текстовых файлов в один файл в Bash - PullRequest
256 голосов
/ 28 января 2010

Какой самый быстрый и самый прагматичный способ объединить все * .txt файлы в каталоге в один большой текстовый файл?

В настоящее время я использую Windows с Cygwin, поэтому у меня есть доступ к BASH.

Командная оболочка Windows тоже подойдет, но я сомневаюсь, что она есть.

Ответы [ 11 ]

458 голосов
/ 28 января 2010

Добавляет вывод в all.txt

cat *.txt >> all.txt

Это перезаписывает all.txt

cat *.txt > all.txt
126 голосов
/ 28 января 2010

Помните, что для всех приведенных решений оболочка определяет порядок, в котором файлы объединяются. Для Bash, IIRC, это в алфавитном порядке. Если порядок важен, вы должны либо присвоить файлам имена соответственно (01file.txt, 02file.txt и т. Д.) Или указать каждый файл в том порядке, в котором вы хотите его объединить.

$ cat file1 file2 file3 file4 file5 file6 > out.txt
33 голосов
/ 28 января 2010

Команда оболочки Windows type может сделать это:

type *.txt >outputfile

Команда type type также записывает имена файлов в stderr, которые не фиксируются оператором перенаправления > (но отображаются на консоли).

24 голосов
/ 28 января 2010

Вы можете использовать оболочку Windows copy для объединения файлов.

C:\> copy *.txt outputfile

Из справки:

Чтобы добавить файлы, укажите один файл для места назначения, но несколько файлов для источника (используя подстановочные знаки или формат file1 + file2 + file3).

5 голосов
/ 09 апреля 2018

Будьте осторожны, поскольку ни один из этих методов не работает с большим количеством файлов. Лично я использовал эту строку:

for i in $(ls | grep ".txt");do cat $i >> output.txt;done

РЕДАКТИРОВАТЬ: Как кто-то сказал в комментариях, вы можете заменить $(ls | grep ".txt") на $(ls *.txt)

РЕДАКТИРОВАТЬ: благодаря опыту @gnourf_gnourf, использование glob является правильным способом перебора файлов в каталоге. Следовательно, кощунственные выражения типа $(ls | grep ".txt") должны быть заменены на *.txt (см. Статью здесь ).

Хорошее решение

for i in *.txt;do cat $i >> output.txt;done
5 голосов
/ 28 января 2010

самый прагматичный способ с оболочкой - это команда cat. другие способы включают,

awk '1' *.txt > all.txt
perl -ne 'print;' *.txt > all.txt
4 голосов
/ 12 июля 2016

Как насчет этого подхода?

find . -type f -name '*.txt' -exec cat {} + >> output.txt
3 голосов
/ 03 мая 2011
type [source folder]\*.[File extension] > [destination folder]\[file name].[File extension]

Например:

type C:\*.txt > C:\1\all.txt

, который возьмет все текстовые файлы в папке C: \ и сохранит их в папке C: \ 1 под именем all.txt

Или

type [source folder]\* > [destination folder]\[file name].[File extension]

Например:

type C:\* > C:\1\all.txt

Это займет все файлы, которые присутствуют в папке, и поместит туда содержимое в C: \ 1 \ all.txt.

0 голосов
/ 12 июня 2019

Когда вы сталкиваетесь с проблемой, когда он переворачивает all.txt в all.txt, Вы можете попробовать проверить all.txt или нет, если существует, удалить

Как это:

[ -e $"all.txt" ] && rm $"all.txt"

0 голосов
/ 23 мая 2019

Вы можете сделать так: cat [directory_path]/**/*.[h,m] > test.txt

Если вы используете {} для включения расширения файлов, которые вы хотите найти, возникает проблема с последовательностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...