有没有办法在find的输出上应用bash变量替换?我知道我已经看到有人在堆栈溢出时这样做但我似乎无法找到那个特定的帖子了.
举个例子,假设我要将文件* .png重命名为* _copy.png.我知道我可以使用重命名来做到这一点,但这只是一个思想实验.
现在我希望能够做到这样的事情:
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"' "{}" \;
我花了一段时间才得到这个问题.基本上你要问的是:
原文链接:https://www.f2er.com/bash/386920.htmlecho "${test.png%.png}"
可以用来得到单词测试.
答案是不.以${开头的string manipulation operators是parameter substitution operators的子集.它们仅适用于变量,而不是字符串文字,这意味着您需要先将字符串存储在变量中.喜欢这个:
img="test.png" echo "${img%.png}"
对于来自谷歌的旅行者,我会使用重命名来完成这项特殊任务. (正如OP已经在他的问题中提到的那样).该命令可能如下所示:
find -name '*png' -execdir rename 's/\.png/_copy.png/' {} +