Linux 什么';这个bash命令(find+;xarg+;grep)有什么问题?
我正在通过这样做来学习bash脚本,我必须找到不包含特定字符串的文件,并且我提出的命令不起作用。同时,我通过使用grep-L(stackoverflow.com/questions/1748129/)解决了这个问题,但我仍然想知道,我原来的命令有什么问题(这样我可以为将来学习) 命令是:Linux 什么';这个bash命令(find+;xarg+;grep)有什么问题?,linux,bash,Linux,Bash,我正在通过这样做来学习bash脚本,我必须找到不包含特定字符串的文件,并且我提出的命令不起作用。同时,我通过使用grep-L(stackoverflow.com/questions/1748129/)解决了这个问题,但我仍然想知道,我原来的命令有什么问题(这样我可以为将来学习) 命令是: find path/ -name *.log -print0 | xargs -0 -i sh -c "if [ '1' == $(cat {} | grep -c 'string that should no
find path/ -name *.log -print0 | xargs -0 -i sh -c "if [ '1' == $(cat {} | grep -c 'string that should not occur') ]; then echo {}; fi"
错误呢
cat: {}: No such file or directory
我以前也试过不用“sh-c”,但也没用
编辑:
我也试过了
find ./path -name *.log -print0 | xargs -0 -i bash -c "if [ '0' == $(cat $0 | grep -c \"ren0 \[RenderJob\] Render time:\") ]; then echo $0; fi" {}
由于的原因,它不起作用。您可以像这样使用
find
和xargs
:
find path/ -name '*.log' -print0 |
xargs -r0 -I {} bash -c 'grep -q "string that should not occur" "{}" || echo "{}"'
如果没有bash-c
,您可以使用grep-L
执行此操作:
find path/ -name '*.log' -print0 |
xargs -r0 grep -L "string that should not occur"
xargs不会插值{} 尝试:
打印所有匹配的文件。为什么
查找…|xargs-0-ish-c“echo{}”
work?在xargs
命令行末尾使用{}
是毫无意义的;这就是它在没有任何-I
选项的情况下所做的。作为最后的调整,xargs-r
避免在find
没有返回任何匹配项的情况下运行该命令。-I{}
和final{}
在第一个示例中也是多余的。@anubhava对我来说,它看起来像一个bug。当然,OP的代码可以优化,例如它根本不使用xargs
,它可以使用find的-exec
选项。但是-IMHO-它至少不应该抛出这个错误。运行子shell,然后在传递给shell的字符串中插入文件名,这完全否定了find-print0
和xargs-0
的好处。您可能需要类似于查找-打印0 | xargs-r0 sh-c'表示f;用“$f”做事情;完成“\uu
,以便正确传递任意文件名。当然,您的shell脚本就是一个主要的示例。cat
是无用的,test
是无用的,grep-c
是无用的。。。您希望grep-q'string'$f”| | echo“$f”简单明了。尽管@anubhava指出,grep-L
可以做到这一点,如果您有一个支持此选项的grep
版本。感谢您的评论和链接:)这无法处理包含空格或shell元字符的文件名,并且有多个与此相关的错误。(对不起,今天的落选票中没有…/:
find path/ -name "*.log" | \
while read file; do
if grep -q 'string that should not occur' "$file"; then
echo $file ;
fi ;
done