使用时
$ 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 包含两个字符“{}”,但不仅仅是两个字符“{}”,是否是实现定义的寻找替换这两个字符或不加更改地使用该字符串。
...如果存在多个包含两个字符“{}”的参数,则行为未指定。