将很多文件连接到标准输出

concat a lot of files to stdout

我的目录中有大量文件 - ~100k。我想合并它们并将它们通过管道传输到标准输出(我需要将它们作为一个文件上传到其他地方),但是 cat $(ls) 抱怨 -bash: /bin/cat: Argument list too long。我知道如何将所有这些文件合并到一个临时文件中,但我可以避免它吗?

 find . -type f -print0 |xargs -0 cat 

xargs 将多次调用 cat,每次在命令行中使用尽可能多的参数(参数的组合长度不能超过 getconf ARG_MAX).

-print0(用 [=15=] 分隔文件)用于 find 结合 -0(处理文件用 [=15=] 分隔)用于 xargs 只是一个要遵循的好习惯,因为它可以防止命令中断带有特殊字符或白色字符的文件名。

首先,cat $(ls) 不是解决此问题的正确方法 - cat * 会更合适。如果文件数量太多,可以这样使用find

find -exec cat {} +

这结合了 find 的结果并将它们作为参数传递给 cat,根据需要执行尽可能多的单独实例。这与 xargs 的行为方式非常相似,但不需要单独的过程或使用任何非标准功能,如 -print0,仅在 find 的某些版本中受支持.

find 默认是递归的,所以如果你的版本支持,你可以指定一个 -maxdepth 1 来防止这种情况。如果目录中还有其他东西,你也可以通过-type过滤(但我猜没有,根据你原来的尝试)。