组合文本文件列表(太长),在两者之间添加换行符

Combine list of text files (too long), adding newline separator in between

我有一个包含约 300K 个文本文件的目录,我想将这些文件连接成一个文件,使用换行符分隔每个文件的内容 \n。例如

file1 = 'i like apples'
file2 = 'john likes oranges'
output = 'i like apples\njohn likes oranges'

问题是由于文件较多,命令如

awk '{print}' dir/* combined.txt

抛出关于参数列表太长的错误。有什么快速解决这个问题的方法吗?我一直在尝试找到一种使用管道的方法,但到目前为止一直没有成功。

文本文件不以 \n 结尾。

为避免命令行过长,您可以使用 shell 构造,例如 for 循环:

for f in dir/*; do cat "$f"; printf '\n'; done > combined.txt

如果组合文件中的文件顺序无关紧要,您可以使用find代替:

find dir -type f -exec sed -s '$s/$/\n/' {} + > combined.txt

这使用 find -exec 来尽量减少调用 -exec 中命令的次数,同时避免命令行太长。

sed -s '$s/$/\n' 用换行符替换文件中最后一行的结尾; -s 确保在提供多个文件作为参数时将更改应用于每个文件。

处理大量文件的一个好方法是使用 find,这在当今大多数发行版中都是相当标准的。类似的东西:

find ./dir -type f -exec bash -c "cat \{\} >> combined.txt && echo '' >> combined.txt"\;

我没有测试过,但这应该可以,而且优点是永远不会构建包含 dir

中所有文件的参数列表

GNU 并行解决方案:

printf '%s[=10=]' * | parallel -0 'cat {}; echo' > combined.txt

小错误:combined.txt 将以未指定的 \n 结尾。

不过,我的猜测是您会受到 I/O 的限制,因此 Benjamin W. 的解决方案可能更快。