Ответы:
Это добавляет вывод к all.txt
cat *.txt >> all.txt
Это перезаписывает all.txt
cat *.txt > all.txt
echo *.txt | xargs cat > all.txt
Просто помните, что для всех приведенных решений оболочка определяет порядок, в котором файлы объединяются. Для Bash, IIRC, это в алфавитном порядке. Если порядок важен, вы должны либо назвать имена файлов соответствующим образом (01file.txt, 02file.txt и т. Д.) Или указать каждый файл в том порядке, в котором вы хотите его объединить.
$ cat file1 file2 file3 file4 file5 file6 > out.txt
Команда оболочки Windows type
может сделать это:
type *.txt >outputfile
type
Команда type также записывает имена файлов в stderr, которые не >
перехватываются оператором перенаправления (но отображаются на консоли).
Вы можете использовать оболочку Windows copy
для объединения файлов.
C:\> copy *.txt outputfile
Из справки:
Чтобы добавить файлы, укажите один файл для места назначения, но несколько файлов для источника (используя подстановочные знаки или формат file1 + file2 + file3).
Будьте осторожны, потому что ни один из этих методов не работает с большим количеством файлов. Лично я использовал эту строку:
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
for i in $(ls *.txt);do cat $i >> output.txt;done
?
ls | grep
это очень плохой антипаттерн).
ls *.txt
сбой, если файлов слишком много (ошибка списка аргументов слишком длинная)?
самый прагматичный способ с оболочкой - это команда cat. другие способы включают в себя,
awk '1' *.txt > all.txt
perl -ne 'print;' *.txt > all.txt
cat
методы, конкатенация последней строки и первой строки из соседних файлов
Как насчет этого подхода?
find . -type f -name '*.txt' -exec cat {} + >> output.txt
-maxdepth 1
в find
команду.
sort -u --output="$OUTPUT_FILE" --files0-from=- < <(find "$DIRECTORY_NAME" -maxdepth 1 -type f -name '*.txt' -print0)
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.
Вы можете сделать так:
cat [directory_path]/**/*.[h,m] > test.txt
Если вы используете {}
расширение файлов, которые вы хотите найти, возникает проблема последовательности.
Когда вы сталкиваетесь с проблемой, в которой он переворачивает all.txt в all.txt, вы можете попробовать проверить, существует ли all.txt или нет, если существует, удалить
Как это:
[ -e $"all.txt" ] && rm $"all.txt"
cat *.txt > all.txt
>
команда перезаписывает all.txt, если он существует, >>
добавляет данные в существующий файл
все это противно ....
ls | grep *.txt | while read file; do cat $file >> ./output.txt; done;
легкий материал
find . -iname "*.txt" -maxdepth 1 -exec cat {} >> out.txt \;