在Bash中将多个文本文件连接成一个文件

时间:2010-01-27 22:03:28

标签: bash shell

将目录中的所有* .txt文件合并到一个大文本文件中的最快捷,最实用的方法是什么?

目前我正在使用带有cygwin的windows,所以我可以访问BASH。

Windows shell命令也不错,但我怀疑它有一个。

12 个答案:

答案 0 :(得分:453)

这会将输出附加到all.txt

cat *.txt >> all.txt

这会覆盖all.txt

cat *.txt > all.txt

答案 1 :(得分:125)

请记住,对于目前为止给出的所有解决方案,shell决定了文件连接的顺序。对于Bash,IIRC,这是按字母顺序排列的。如果顺序很重要,您应该正确命名文件(01file.txt,02file.txt等等),或者按照您想要连接的顺序指定每个文件。

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

答案 2 :(得分:33)

Windows shell命令type可以执行此操作:

type *.txt >outputfile

类型type命令还会将文件名写入stderr,>重定向操作符不会捕获这些文件名(但会显示在控制台上)。

答案 3 :(得分:24)

您可以使用Windows shell copy来连接文件。

C:\> copy *.txt outputfile

来自帮助:

  

要附加文件,请为目标指定单个文件,但为源指定多个文件(使用通配符或file1 + file2 + file3格式)。

答案 4 :(得分:4)

shell最实用的方法是cat命令。其他方式包括,

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

答案 5 :(得分:4)

这种做法怎么样?

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

答案 6 :(得分:4)

要小心,因为这些方法都不适用于大量文件。就个人而言,我使用了这一行:

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

编辑:正如有人在评论中所说,您可以将$(ls | grep ".txt")替换为$(ls *.txt)

编辑:感谢@gnourf_gnourf的专业知识,使用 glob 是迭代目录中文件的正确方法。因此,$(ls | grep ".txt")等亵渎神明的表达方式必须替换为*.txt(请参阅文章here)。

良好的解决方案

for i in *.txt;do cat $i >> output.txt;done

答案 7 :(得分:3)

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

例如:

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

这将获取C:\ Folder中的所有txt文件,并将其保存在C:\ 1文件夹中,名称为all.txt

或者

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

例如:

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

这将获取文件夹中存在的所有文件,并将内容放在C:\ 1 \ all.txt

答案 8 :(得分:0)

您可以这样做: cat [directory_path]/**/*.[h,m] > test.txt

如果您使用{}包含要查找的文件的扩展名,则会出现排序问题。

答案 9 :(得分:0)

当您遇到将all.txt纳入all.txt的问题时, 您可以尝试检查all.txt是否存在,如果存在,请删除

赞:

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

答案 10 :(得分:0)

如果文件列表过长,最受好评的答案将失败。

更便携的解决方案将使用fd

fd -e txt -d 1 -X awk 1 > combined.txt

-d 1将搜索限制为当前目录。如果省略此选项,则它将递归地找到当前目录中的所有.txt文件。
-X(也称为--exec-batch)一次对所有搜索结果执行命令(在这种情况下为awk 1)。

答案 11 :(得分:-4)

所有这些都令人讨厌......

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

简单的东西。