【发布时间】:2023-03-27 11:18:01
【问题描述】:
有没有办法在find 的输出上应用bash 变量替换?我知道我已经看到有人在堆栈溢出时这样做了,但我似乎再也找不到那个特定的帖子了。
作为示例,假设我想将文件 *.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"' "{}" \;
【问题讨论】:
-
在问题中编辑答案(甚至是共识摘要)是不受欢迎的,因为它使该答案不受正常审查、投票和其他基于社区的管理的影响。如果您想获得一个建立在他人工作基础上的答案,而不是以您的名义/为了您自己的代表增益而呈现,请考虑添加一个标记为“社区 wiki”的答案。
标签: bash find exec substitution built-in