有没有办法在find
的输出中应用Bash变量替换?我知道我曾经在Stack Overflow上看到过有人这样做,但现在好像找不到那篇帖子了。
例如,假设我想将以*.png
结尾的文件重命名为*_copy.png
。 我知道我可以使用rename
来完成这个任务,但这只是一个思考实验。
现在我想要做这样的事情:
find . -name "*png" -exec mv "{}" "${{}%.*}_copy.png" \;
这将导致一个无效的替换。当然,我可以先将输出赋值给一个变量,然后在子shell中应用替换,但这真的是唯一的方法吗?
find . -name "*.png" -exec bash -c 'var="{}"; mv "{}" "${var%.*}_copy.png"' \;
还是有没有办法直接从{}
实现这个目标呢?
共识
正如Etan Reisner所指出的那样,处理find
的输出更好、更安全的方法是将其作为位置参数传递:
find . -name "*.png" -exec bash -c 'mv "$0" "${0%.*}_copy.png"' "{}" \;