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

标签 bash find exec substitution built-in

有没有办法申请Bash variable substitution find 的输出?我知道我已经在 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"' "{}" \;

最佳答案

我花了一段时间才明白这个问题。基本上你是在问是否是这样的:

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

可用于获取单词test

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

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

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

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

关于通过 exec 对 find 的输出进行 Bash 变量替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48512111/

相关文章:

Bash 别名查询

bash - 查找与给定模式匹配并排除给定模式的所有文件?

java - 从另一个程序触发java程序会使用相同的JVM还是会使用不同的JVM?

MySQL:执行命令

python - Linux:写入 python 解释器进程的 stdin 并让该进程将输入评估为代码

bash - 根据特定子字符串对 Bash 中的字符串列表进行数字排序

bash - 如何在脚本中使用 exec 3>myfifo,而不是让 echo foo>&3 关闭管道?

linux - 仅当行号以 + csv 文件开头时才替换行中的单词

javascript - 获取类等于 active 的 div 的索引

msbuild - 如何使用 msbuild 获取 exec 任务输出