Объединение нескольких текстовых файлов в один файл в Bash

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

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

Командная оболочка Windows тоже будет хороша, но я сомневаюсь, что она есть.

Ответ 1

Это добавляет вывод в файл all.txt

cat *.txt >> all.txt

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

cat *.txt > all.txt

Ответ 2

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

$ cat file1 file2 file3 file4 file5 file6 > out.txt

Ответ 3

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

type *.txt >outputfile

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

Ответ 4

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

C:\> copy *.txt outputfile

С помощью:

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

Ответ 5

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

awk '1' *.txt > all.txt
perl -ne 'print;' *.txt > all.txt

Ответ 6

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

find . -type f -name '*.txt' -exec cat {} + >> output.txt

Ответ 7

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

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

Ответ 8

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

Пример:

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

Это возьмет все файлы 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

Ответ 9

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

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

Ответ 10

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

Ответ 11

все это неприятно....

ls | grep *.txt | while read file; do cat $file >> ./output.txt; done;

легкий материал.