我想合并类似的内容:
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
实现。