我正在尝试对发现的内容运行多个命令,如何实现呢?
find . -exec cmd1; cmd2
似乎不起作用;相反,在每个文件上执行cmd1之后,它将运行cmd2。
我正在尝试对发现的内容运行多个命令,如何实现呢?
find . -exec cmd1; cmd2
似乎不起作用;相反,在每个文件上执行cmd1之后,它将运行cmd2。
Answers:
在此演示中,我将首先使用sh -c 'echo first; false'
(或true
)-exec
。这将提供一些输出,并具有选定的退出代码效果。然后echo second
将用于第二个。假设当前目录中只有一个文件。
$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
这种类型的真实命令如下所示:
find . -type f \( -exec command1 \; -false -o -exec command2 \; \)
在第二组中,转义括号将两个-exec
子句分组。在-false
它们之间迫使测试状态为“假”,并且-o
原因下一个表达式(第二-exec
由于待评估)-false
。
来自man find
:
expr1 expr2
连续两个表达式都用隐含的“ and”连接;如果expr1为false,则不会评估expr2。expr1 -a expr2
与expr1 expr2相同。expr1 -o expr2
或; 如果expr1为true,则不会评估expr2。
如果您对cmd1能够阻止由于错误代码而无法运行cmd2无关紧要,则0
:
find . -exec cmd1 \; -exec cmd2 \;
使两个命令始终运行的唯一可靠方法是find
调用一个外壳,该外壳随后将依次运行这些命令:
find . -exec bash -c 'cmd1; cmd2' filedumper {} \;
如果您不介意制作一个执行cmd1和cmd2的脚本,那么就是这样:
find . -exec myscript {} \;
要么
find . -exec myscript {} +
采用 \; 或+,取决于myscript一次是否可以处理多个文件(如果文件名中有空格等,则会变得冗长)。
根据我的经验,将您正在做的事情放在脚本中几乎总是值得的。如果必须执行一次,则必须再次执行。
但是一个巧妙的技巧是将查找内容放入脚本中:
if [ $# -gt 0 ]; then
for each; do
touch $each
done
else
find . -exec $0 {} +
fi
然后,myscript可以在您作为参数提供给它的文件上工作,但是如果您不给它任何参数,它将在当前目录下运行find,然后在找到的文件上进行调用。这可以避免以下事实:find -exec无法调用您在脚本中定义的shell函数。
我一直在尝试两种先前的解决方案,但运气不佳。这对我来说很好:
$ for i in `find . -exec echo {} \;`; do cmd1 $i; cmd2 $i; done
尝试命令:
sudo find -name "*[!0-9][1-9].txt" -exec chmod 744 * {} \; -a -exec ls -l {} \; | sort | parallel ls -l
*
在-exec
部分将扩大到当前目录中的所有文件。尤其是当运行时sudo
。
-o
。