通过exec对find的输出进行Bash变量替换

时间:2015-05-27 11:49:13

标签: bash find exec substitution built-in

有没有办法在bash的输出上应用find变量替换?我知道我已经看到有人在堆栈溢出时做了,但我似乎找不到那个特定的帖子了。

例如,假设我想将文件*.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"' "{}" \;

1 个答案:

答案 0 :(得分:2)

我花了一段时间才得到这个问题。基本上你要问的是:

echo "${test.png%.png}"

可用于获取单词test

答案是否定的。以${开头的string manipulation operatorsparameter substitution operators的子集。它们仅适用于变量,而不适用于字符串文字,这意味着您需要先将字符串存储在变量中。像这样:

img="test.png"
echo "${img%.png}"

对于来自Google的旅行者,我会使用rename来执行此特定任务。 (正如OP在他的问题中已经提到的那样)。该命令可能如下所示:

find -name '*png' -execdir rename 's/\.png/_copy.png/' {} +