我有 14 个文件,全部都是一篇文本的一部分。我想将它们合二为一。怎么做?
答案1
从技术上讲,这就是cat
(“连接”)应该做的事情,尽管大多数人只是使用它来将文件输出到标准输出。如果你给它多个文件名,它会按顺序输出它们,然后你可以将其重定向到一个新文件中;如果是所有文件,只需使用./*
(或者/path/to/directory/*
如果您不在该目录中),您的 shell 会将其扩展为所有文件名(默认情况下不包括隐藏文件)。
$ cat ./* > merged-file
确保您不使用csh
或tcsh
shell 来扩展 glob后打开merged-file
for 输出,而这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