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

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

目前我正在使用cygwin的窗口,所以我可以访问BASH。

Windows shell命令也会很好,但我怀疑有没有一个。

394735 次浏览

这会将输出追加到all.txt

cat *.txt >> all.txt

这将覆盖all.txt

cat *.txt > all.txt

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

C:\> copy *.txt outputfile

来自帮助:

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

Windows shell命令type可以做到这一点:

type *.txt > outputfile.txt

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

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

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

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

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

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

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

简单的东西。

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

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

这种方法怎么样?

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

要小心,因为这些方法都不能处理大量文件。就我个人而言,我用了这句话:

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

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

编辑:感谢@gnourf_gnourf的专业知识,使用一团是在目录中迭代文件的正确方法。因此,像$(ls | grep ".txt")这样亵渎神灵的表达式必须被*.txt取代(参见文章在这里)。

好的解决方案

for i in *.txt;do cat $i >> output.txt;done
你可以这样做: cat [directory_path]/**/*.[h,m] > test.txt < / p >

如果你使用{}来包含你想要查找的文件的扩展名,就会有一个排序问题。

当你遇到一个问题,它把all.txt变成了all.txt, 您可以尝试检查all.txt是否存在,如果存在,删除

是这样的:

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

如果文件列表太长,点赞最多的答案将失败。

一个更可移植的解决方案是使用fd

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

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

注意,fd不是一个“标准”;Unix程序,所以你可能需要安装