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

Tam*_*man 58 linux command-line find

我正在尝试对我发现的东西运行多个命令,我该如何实现?

find . -exec cmd1; cmd2
Run Code Online (Sandbox Code Playgroud)

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

Den*_*son 39

在这个演示中,我将使用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
Run Code Online (Sandbox Code Playgroud)

这种类型的实际命令如下所示:

find . -type f \( -exec command1 \; -false -o -exec command2 \; \)
Run Code Online (Sandbox Code Playgroud)

在第二组中,转义括号将两个-exec子句分组。在-false它们之间迫使测试状态为“假”,并且-o使下一个表达式(第二-exec),以由于进行评价-false

man find

expr1 expr2
连续的两个表达式被认为是用一个隐含的“和”连接起来的;如果 expr1 为假,则不评估 expr2。

expr1 -a expr2
与 expr1 expr2 相同。

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


Ign*_*ams 34

如果您不关心 cmd1 能够阻止 cmd2 由于错误代码运行0

find . -exec cmd1 \; -exec cmd2 \;
Run Code Online (Sandbox Code Playgroud)

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

find . -exec bash -c 'cmd1; cmd2' filedumper {} \;
Run Code Online (Sandbox Code Playgroud)