目录中有大量文件--~100k。我想将它们组合起来并将它们传输到标准输出(我需要将它们作为一个文件上传到其他地方),但是cat $(ls)
抱怨-bash: /bin/cat: Argument list too long
。我知道如何将所有这些文件合并为一个临时文件,但我可以避免它吗?
答案 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
进行过滤(但我认为根据您的原始尝试,我们没有。)