加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 18:58:08 所属栏目:安全 来源:网络整理
导读:有没有办法在find的输出上应用bash变量替换?我知道我已经看到有人在堆栈溢出时这样做但我似乎无法找到那个特定的帖子了. 举个例子,假设我要将文件* .png重命名为* _copy.png.我知道我可以使用重命名来做到这一点,但这只是一个思想实验. 现在我希望能够做到
有没有办法在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"' "{}" ;
我花了一段时间才得到这个问题.基本上你要问的是:
echo "${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/' {} +

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读