Linux 什么';这个bash命令(find+;xarg+;grep)有什么问题?

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

我正在通过这样做来学习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 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