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

Yad*_*ada 267 bash shell

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

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

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

Rob*_*ner 482

这会将输出附加到all.txt

cat *.txt >> all.txt
Run Code Online (Sandbox Code Playgroud)

这会覆盖all.txt

cat *.txt > all.txt
Run Code Online (Sandbox Code Playgroud)

  • 你可能会遇到一个问题,它将all.txt猫all.txt ...我有时会遇到grep这个问题,不确定cat是否有相同的行为. (27认同)
  • 避免参数列表太长:`echo*.txt | xargs cat> all.txt` (27认同)
  • 我得到"参数列表太长" - 猜测它无法处理40,000多个文件. (14认同)
  • @rmeador是的,这是真的,如果all.txt已经存在,你将遇到这个问题.通过为输出文件提供不同的扩展名或将all.txt移动到其他文件夹,可以解决此问题. (8认同)
  • cat*.txt >> tmp; mv tmp all.txt(并确保事先不存在all.txt) (2认同)
  • 有没有一种简单的方法可以在每个文件之间添加额外的换行符? (2认同)
  • @MaxCandocia `sed -i -e '$a\' filename.txt` 将在 filename.txt 中追加一个新行。`找到。-name "*.txt" -type f -print0 | xargs -0 -n 1 -P 8 sed -i -e '$a\'` 将对当前文件夹中的所有 txt 文件执行此操作(将 P 设置为您的逻辑处理器的数量,它将同时使用您所有的线程)。 (2认同)

Chi*_*chi 133

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

$ cat file1 file2 file3 file4 file5 file6 > out.txt
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 33

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

type *.txt >outputfile
Run Code Online (Sandbox Code Playgroud)

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

  • 用户请求 bash (8认同)
  • 请注意,如果将输出文件放在与原始文件相同的目录中,则会导致重复,因为它还会将新输出文件组合两次. (2认同)

Car*_*rum 25

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

C:\> copy *.txt outputfile
Run Code Online (Sandbox Code Playgroud)

从帮助:

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

  • 你读过这个问题吗?“ Windows shell命令也将很好...” (2认同)

gho*_*g74 6

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

awk '1' *.txt > all.txt
perl -ne 'print;' *.txt > all.txt
Run Code Online (Sandbox Code Playgroud)

  • `perl -pe 1 * .txt> all.txt` (3认同)
  • 对于大多数情况来说,这应该是正确的答案。如果任何文本文件没有空新行,则使用上述所有“cat”方法将连接相邻文件的最后一行和第一行。 (2认同)

GPr*_*hap 5

这种方法怎么样?

find . -type f -name '*.txt' -exec cat {} + >> output.txt
Run Code Online (Sandbox Code Playgroud)

  • 非常适合处理大量文件,而接受的回复方法失败 (3认同)

Jac*_*169 5

请注意,因为这些方法都无法处理大量文件。我个人使用以下行:

for i in $(ls | grep ".txt");do cat $i >> output.txt;done
Run Code Online (Sandbox Code Playgroud)

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

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

好的解决方案

for i in *.txt;do cat $i >> output.txt;done
Run Code Online (Sandbox Code Playgroud)

  • 为什么不`for i in $(ls *.txt);do cat $i >> output.txt;done`? (2认同)
  • 强制性[ParsingLs](https://mywiki.wooledge.org/ParsingLs)链接,以及一个downvote(并且您应获得多个downvote,因为`ls | grep`是一个非常糟糕的反模式)。 (2认同)