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

Iva*_*van 130 text-processing files

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

Mic*_*zek 229

这在技术上是cat("concatenate") 应该做的,即使大多数人只是使用它来将文件输出到 stdout。如果你给它多个文件名,它会按顺序输出它们,然后你可以将它重定向到一个新文件中;在所有文件的情况下只使用*(或者/path/to/directory/*如果您不在目录中)并且您的外壳将其扩展为所有文件名

$ cat * > merged-file
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您的引用命令的编号方式使 shell 以“自然”顺序扩展 `*`,那么您引用的命令可能只会执行发布者想要的操作。如果您有“file1.txt...file9.txt...file14.txt”,它将不起作用,因为 file1?.txt 将在 file1.txt 和 file2.txt 之间排序。您必须将它们重命名为“file01.txt...file09.txt...file14.txt”。如果不确定,请说“echo *”。 (24认同)
  • @Warren:好点子(或者你可以使用 zsh 并设置它的 `numeric_glob_sort` 选项)。 (3认同)
  • @warren-young 一个正确、有用的警告评论。但在我的实际情况下,顺序没有区别(因为文件只包含简单的 SQL 语句,插入没有依赖关系的数据记录)。 (2认同)
  • 请注意,如果文件数超过某个限制,您可能会遇到类似 - /bin/cat: Argument list too long 的错误 (2认同)

小智 32

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

find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
Run Code Online (Sandbox Code Playgroud)

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


更便携:

find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
Run Code Online (Sandbox Code Playgroud)

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

  • 您需要 -name "*.csv" 而不是 -name *.csv - 没有引号它会失败。 (3认同)
  • 如果你有很多文件,这是要走的路。您可以避免“参数列表太长”错误。 (2认同)
  • 请参阅 [为什么循环查找的输出是不好的做法?](http://unix.stackexchange.com/q/321697/135943) (2认同)

小智 12

命令

$ cat * > merged-file
Run Code Online (Sandbox Code Playgroud)

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

$ cat * > ../merged-file
Run Code Online (Sandbox Code Playgroud)

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

$ cat *.txt > merged-file
Run Code Online (Sandbox Code Playgroud)

  • `cat * > 合并文件` 工作正常。在创建文件之前处理 Glob。如果 `merged-file` 已经存在,`cat`(至少是我的)会检测到它是输出文件并拒绝读取它。如果文件已经存在并且您在管道中稍后有重定向,那么它显然不能这样做,所以只有这样您才能获得失控的文件。 (15认同)

Flo*_*ita 11

就像这里的其他人说的......你可以使用 cat

假设你有:

~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
Run Code Online (Sandbox Code Playgroud)

而你只想要file01file03fileAfileC

cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
Run Code Online (Sandbox Code Playgroud)

或者,使用大括号扩展:

cat ~/file0{1..3} ~/file{A..C} > merged-file
Run Code Online (Sandbox Code Playgroud)

或者,使用更高级的大括号扩展:

cat ~/file{0{1..3},{A..C}} > merged-file
Run Code Online (Sandbox Code Playgroud)

或者你可以使用for循环:

for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
Run Code Online (Sandbox Code Playgroud)