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

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

我正尝试对我发现的事物运行多个命令,我该如何实现呢?

find . -exec cmd1; cmd2

似乎不起作用;而是在每个文件上执行完 cmd1 后才运行 cmd2。

答案1

在此演示中,我将使用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它们之间的 强制测试状态为“false”,并且-o导致下一个表达式(第二个-exec)由于 而被求值-false

man find

expr1 expr2
一行中的两个表达式被视为以隐含的“与”连接;如果 expr1 为假,则不会对 expr2 进行求值。

expr1 -a expr2
与 expr1 expr2 相同。

expr1 -o expr2
或者;如果 expr1 为真,则不会评估 expr2。

答案2

如果您不介意 cmd1 能够由于错误代码而阻止 cmd2 运行0

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

让这两个命令始终运行的唯一可靠方法是调用find一个 shell,然后按顺序运行这两个命令:

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

答案3

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

答案4

尝试命令:

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

相关内容