如何将目录中的所有(文本)文件合并为一个?

如何将目录中的所有(文本)文件合并为一个?

我有 14 个文件,全部都是一篇文本的一部分。我想将它们合二为一。怎么做?

答案1

从技术上讲,这就是cat(“连接”)应该做的事情,尽管大多数人只是使用它来将文件输出到标准输出。如果你给它多个文件名,它会按顺序输出它们,然后你可以将其重定向到一个新文件中;如果是所有文件,只需使用./*(或者/path/to/directory/*如果您不在该目录中),您的 shell 会将其扩展为所有文件名(默认情况下不包括隐藏文件)。

$ cat ./* > merged-file

确保您不使用cshtcshshell 来扩展 glob打开merged-filefor 输出,而这merged-file之前并不存在,否则您可能会遇到一个无限循环,填满文件系统。

文件列表按词法排序。如果使用zsh,您可以使用 glob 限定符更改顺序(更改为数字,或按年龄、大小...)。

要将文件包含在子目录中,请使用:

find . ! -path ./merged-file -type f -exec cat {} + > merged-file

但请注意,文件列表未排序,并且包含隐藏文件。-type f这里限制为常规的文件,因为您不太可能想要包含其他类型的文件。使用 GNU find,您可以将其更改为-xtype f还包含常规文件的符号链接。

使用 zsh shell,

cat ./**/*(-.) > merged-file

会做同样的事情((-.)实现相当于-xtype f),但给你一个排序列表并排除隐藏文件(添加D限定符将它们带回来)。zargs可以用来解决这个问题参数列表太长错误。

答案2

如果您的文件不在同一目录中,您可以在串联之前使用 find 命令:

find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file

当您的文件已经排序并且您想要合并它们以进行分析时非常有用。


更便携:

find /path/to/directory/ -name *.csv -exec cat {} + > merged.file

这可能会也可能不会保留文件顺序。

答案3

命令

$ cat * > merged-file

实际上有一个不良的副作用,即在串联中包含“合并文件”,从而创建一个失控文件。要解决这个问题,可以将合并的文件写入不同的目录;

$ cat * > ../merged-file

或使用模式匹配来忽略合并的文件;

$ cat *.txt > merged-file

答案4

您可以指定pattern文件的 ,然后合并所有文件,如下所示:

cat *pattern* >> mergedfile

相关内容