使用find时如何执行多个命令?


Answers:


40

在此演示中,我将首先使用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。


啊,是的,我忘了-o
伊格纳西奥·巴斯克斯

32

如果您对cmd1能够阻止由于错误代码而无法运行cmd2无关紧要,则0

find . -exec cmd1 \; -exec cmd2 \;

使两个命令始终运行的唯一可靠方法是find调用一个外壳,该外壳随后将依次运行这些命令:

find . -exec bash -c 'cmd1; cmd2' filedumper {} \;

2

如果您不介意制作一个执行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函数。


0

我一直在尝试两种先前的解决方案,但运气不佳。这对我来说很好:

$ for i in `find . -exec echo {} \;`; do cmd1 $i; cmd2 $i; done

如果文件列表太大,则无法使用。
亚历克斯(Alex)

-3

尝试命令:

sudo find -name "*[!0-9][1-9].txt" -exec chmod 744 * {} \; -a -exec ls -l {} \; | sort | parallel ls -l

4
嗯,那不是一个好主意。将*-exec部分将扩大到当前目录中的所有文件。尤其是当运行时sudo
slhck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.