【问题标题】:Bash variable substitution on find's output through exec通过 exec 对 find 的输出进行 Bash 变量替换
【发布时间】: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


【解决方案1】:

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

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/' {} +

【讨论】:

  • 是的,我知道,因此我说“我知道我可以使用重命名来做到这一点,但这只是一个思想实验。”。问题是关于替换而不是关于重命名。感谢您的回复。 --附言您可能想在回答中引用{} 来处理空格。
  • 抱歉,忽略了这一点。让我添加一个使用 bash 的示例。
  • 别担心,我总是忽略堆栈溢出的东西,哈哈。
  • @ShellFish 你不需要引用{},因为它不会被分词
  • 顺便说一句,您应该永远{}直接嵌入到使用sh -c或类似方法运行的shell脚本中。空间/等不安全。 (并且没有引用并不能解决它只是将问题转移到引用转义)。您应该始终将其作为位置参数传递给脚本。
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多