find -exec 中的子字符串删除

find -exec 中的子字符串删除

使用时

$ find . -name string~ -exec cp {} FOO \;

有没有一种方法可以像我们通常使用 bash 子字符串那样使用{}in来删除波浪号字符FOO

例如:

 $ echo ${string%substring}

我的目标是将名为 string~ 的文件复制到 string (与 相反$ find . -name string -exec cp {} {}~ \;)。

答案1

在这种情况下,您应该将代码执行填充到生成的 shell 中。

find . -name '*~' -exec sh -c 'cp "$0" "${0%~}"' {} \;

这样你就不需要写脚本了。你只需一句话就能做到。


注意:这里不需要--“选项结束”说明符cp,因为find将为找到的文件添加前缀./,这将阻止它们被解析为 的选项cp

(此前缀的例外情况./是当前目录.本身是“找到的”,但当然该名称不以波浪号结尾,也不会被误认为是选项标志。)


我什至会使用生成的 shell 在副本名称后附加波浪号;换句话说我会用:

find . -name string -exec sh -c 'cp "$1" "$1"~' find-sh {} \;

优先于:

find . -name string -exec cp {} {}~ \;  # Don't use this!

因为后者未由 POSIX 指定,因此不可移植。

来自POSIX 规范find:

如果一个实用程序名称或者争论string 包含两个字符“{}”,但不仅仅是两个字符“{}”,是否是实现定义的寻找替换这两个字符或不加更改地使用该字符串。

...如果存在多个包含两个字符“{}”的参数,则行为未指定。

相关内容