将很多文件连接到stdout

时间:2015-06-08 08:54:59

标签: bash pipeline

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

2 个答案:

答案 0 :(得分:3)

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

xargs将多次调用cat,每次都有尽可能多的参数可以放在命令行上(args的组合长度不能超过getconf ARG_MAX

-print0的{​​{1}}(包含\0的单独文件)与find -0\0分隔的xargs的进程文件)组合curl -XPOST localhost:9200/your_index/_search -d' { "query": { "filtered": { "filter": { "script": { "script": "doc['@timestamp'].date.dayOfWeek == 7" } } } } }' ,只是一个好习惯,因为它会阻止命令打破文件名中包含特殊或白色字符。

答案 1 :(得分:3)

首先,cat $(ls)不是解决此问题的正确方法 - cat *会更合适。如果文件数太高,您可以使用find,如下所示:

find -exec cat {} +

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

默认情况下,

find是递归的,因此如果您的版本支持,则可以指定find来阻止此操作。如果目录中还有其他内容,您也可以按-maxdepth 1进行过滤(但我认为根据您的原始尝试,我们没有。)