我正尝试对我发现的事物运行多个命令,我该如何实现呢?
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