如何将find输出的文件名列表传递给jq?
问题与解决方法
错误原因
你之前的命令出错核心逻辑是:
find ... | jq '.'会把find输出的文件名列表当作纯文本内容传给jq,而jq默认是解析标准输入的JSON数据,显然文件名不是合法JSON结构,因此触发解析错误。jq --arg filename $1 '. $filename'也无效,一是$1在此场景下未定义,二是同样把文件名文本传给jq解析,而非让jq加载对应文件。
正确命令
方法1:用find的-exec参数(推荐)
直接让find调用jq处理每个匹配到的文件:
find . -name 'reddit.*.flattened.json' -exec jq '.' {} +
{} 代表find匹配到的文件名,+ 表示将多个文件名批量传给jq,效率比逐个处理的\;更高。
方法2:用xargs配合管道
如果习惯用管道传递结果,用xargs把文件名转为jq的文件参数:
find . -name 'reddit.*.flattened.json' | xargs jq '.'
若文件名包含空格或特殊字符,建议加上参数避免出错:
find . -name 'reddit.*.flattened.json' -print0 | xargs -0 jq '.'
逻辑验证
单独执行jq '.' FILENAME能正常工作,是因为FILENAME是作为jq的文件参数,让jq读取该文件内的JSON内容;而管道传递的是文件名的文本本身,并非让jq加载文件的指令,这是两种完全不同的输入逻辑。
内容的提问来源于stack exchange,提问作者mac389
相关产品推荐
相关产品推荐

