我们想要 grep 包含一些固定字符串的相应文件,然后仅以 ls -l 格式输出这些文件。
例如:
A) 以下方法使用多个 -exec 输出 grep 和 ls -l。
#
#
# find /usr/bin -type f -exec grep -Eil '#\!\/usr\/bin\/csh' {} \; -exec ls -l {} \; >scripts_csh_list 2>&1
#
#
#
# cat scripts_csh_list
/usr/bin/which
-r-xr-xr-x 1 bin bin 1191 Sep 06 2007 /usr/bin/which
#
#
B) 但我们希望仅使用 ls -l ... 获得更好的方法输出,然后通过 sh -c 'grep ... {}' 失败
注意:find -exec 的以下所有不同组合命令 .. .输出相同的失败结果。
#
#
# find /usr/bin -type f -exec sh -c 'grep -Eil '\/usr\/bin\/csh' {} && ls -ltr {}' \; >scripts_csh_list 2>&1t
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
#
# find /usr/bin -type f -exec sh -c ' grep -Eil '\/usr\/bin\/csh' {} ' \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
# find /usr/bin -type f -exec sh -c ' grep -Eil '\/usr\/bin\/csh' "{}" ' \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
#
# find /usr/bin -type f -exec sh -c " grep -Eil '\/usr\/bin\/csh' {} " \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
#
# find /usr/bin -type f -exec sh -c " grep -Eil '\/usr\/bin\/csh' {} " \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
原文中有很多看似不必要的引用和转义。虽然我在 中没有任何
csh
脚本/usr/bin
,但我能够通过以下方式找到bash
脚本并获得您似乎想要的输出:ls
(我通过在没有第二个的情况下运行来验证这一点
-exec
,例如,并检查结果。)
对于稍微不同的输出列表,您也可以这样做
其中
find
直接统计每个匹配文件本身,并返回ls
类似的结果。我将错误通过管道传输
/dev/null
只是为了在测试时使内容更具可读性;出于类似的原因,我没有将输出通过管道传输到文件。请注意,我使用的
bash
是我的 shell,因此将grep
表达式用单引号 ('...'
) 括起来足以防止对其内容进行任何解释(并不是有太多需要担心的,正斜杠 (/
) 对于 shell 来说并不特殊,在至少对于 bash 来说不是。如果您使用具有不同引用规则的 shell,YMMV。至于该命令,除非您使用该
-o
选项,否则find
会将AND
所有条件结合在一起,因此该命令ls -l
仅在通过检查的常规文件(type f
您包含的文件)上运行grep
。正如您的问题的评论中所指出的,grep -q
可能会做您想要的事情,这只是确定有问题的文件 ({}
) 是否匹配。编辑:如评论中所述,如果用户的 shell 是
csh
,他们将需要转义表达式!
中的grep
:'#\!/usr/bin/bash'
应该有效。最后我们通过 sh -c 'grep ... ' 和 find -exec 命令执行了以下正确的方法。谢谢大家!