如何使用 find -exec {} 进行参数扩展?

如何使用 find -exec {} 进行参数扩展?

我想合并类似的内容:

for f in */*; do mv "$f" "${f%/*}/foo.${f##*.}"; done  

进入我的find x -exec y {} \;风格工作流程。

循环for结构 &"$f"变量可能会被省略;循环将被标准-exec迭代行为替换,变量(包含当前迭代的文件名)被{}.
但这两种不同的语法似乎不兼容/有问题。特别是因为大括号和分号等相互冲突。

答案1

您可以使用-exec bash -c 'your code here using $0'

在你的情况下,这个

find */* -exec bash -c 'mv "$0" "${0%/*}/foo.${0##*.}"' {} \;

与你的非常相似for

for f in */*; do        mv "$f" "${f%/*}/foo.${f##*.}"; done  

-exec sh -c '.....'提示 1:如果您不使用 bash,也可以使用。

-exec提示 2:您可以在同一查找下组合多个:

find ./* -type f -exec echo {} \; -exec cat {} \;

提示 3:对于简单的构造,此语法是有效的:

find . -type f  ! -name "*.txt" -exec mv -v '{}' '{}'.txt \;

提示 4:-exec您可以使用-ok在运行命令之前要求用户确认的方式(对于测试很有用)

以上适用于 GNU find(我有版本 4.6.0),但我不确定所有这些技巧是否适用于其他find实现。

相关内容