grep -l 在到 xargs 的管道上的行为不符合预期[重复]

Posted

技术标签:

【中文标题】grep -l 在到 xargs 的管道上的行为不符合预期[重复]【英文标题】:grep -l does not behave as expected on piping to xargs [duplicate] 【发布时间】:2018-11-27 10:31:20 【问题描述】:

所以我有一个类似的命令:grep "\"tool\":\"SEETEST\"" * -l 独立运行非常好 - 它打印出为当前目录中所选工具生成的 JSON 文件列表。

但是,如果我像这样将它通过管道传输到 xargs ls : grep "\"tool\":\"SEETEST\"" * -l | xargs ls -lSh

打印当前目录下的所有文件!

如何让它只打印匹配的文件名并将它们通过管道传输到按大小排序的 ls?

【问题讨论】:

你可以试试grep -lZ ... | xargs -0 ... 吗?这将排除由于文件名中的空格/换行符/等字符而导致的任何问题 还有一个建议:除非您需要双引号进行插值,否则请始终使用单引号。grep '"tool":"SEETEST"' 谢谢,做了两次修改 - 结果还是一样:( 我认为只有当 grep 命令不匹配任何东西时才会发生这种情况,就像 SEETEST 似乎发生的那样。这是为什么呢? 当前目录下有没有一个名为“*”的文件? 【参考方案1】:

如果 xargs 没有匹配,那么它将列出当前目录中的所有文件:

#----------- current files in the directory
mortiz@florida:~/Documents/projects/bash/test$ ls -ltr
    total 8
    -rw-r--r-- 1 mortiz mortiz 585 Jun 18 12:13 json.example2
    -rw-r--r-- 1 mortiz mortiz 574 Jun 18 12:14 json.example
#----------- using your command
mortiz@florida:~/Documents/projects/bash/test$ grep "\"title\": \"example\"" * -l
json.example
#-----------adding xargs to the previous command
mortiz@florida:~/Documents/projects/bash/test$ grep "\"title\": \"example\"" * -l | xargs ls -lSh
-rw-r--r-- 1 mortiz mortiz 574 Jun 18 12:14 json.example
#-----------adding purposely an error on "title" 
mortiz@florida:~/Documents/projects/bash/test$ grep "\"titleo\": \"example\"" * -l | xargs ls -lSh
total 8.0K
-rw-r--r-- 1 mortiz mortiz 585 Jun 18 12:13 json.example2
-rw-r--r-- 1 mortiz mortiz 574 Jun 18 12:14 json.example

如果你想使用 xargs 并且 grep 没有返回任何匹配,那么添加 "-r | --no-run-if-empty" 将阻止 xargs 列出当前目录中的所有文件:

grep "\"titleo\": \"example\"" * -l | xargs -r ls -lSh

【讨论】:

以上是关于grep -l 在到 xargs 的管道上的行为不符合预期[重复]的主要内容,如果未能解决你的问题,请参考以下文章

[linux]利用管道 + xargs批量管理文件

[linux]利用管道 + xargs批量管理文件

xargs命令详解,xargs与管道的区别

linux之xargs使用技巧

使用 if else 和 xargs 并行管道到 gnu

linux-xargs