grep -l在管道到xargs时没有按预期运行[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

但是,如果我将它管道化为xargs ls那样:grep "\"tool\":\"SEETEST\"" * -l | xargs ls -lSh

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

如何使它只打印匹配的文件名并将它们管理为按大小排序的ls?

bash grep xargs
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.