改变 {} find exec 的参数

3

能否更改传递给find中exec的参数呢? 例如,我需要将文件复制为不同的名称:*.txt -> *.new.txt 现在我需要执行两个命令:

find /root/test -name "*.txt" -exec cp {} {}.new \;
find /root/test -name "*.txt.new" -exec rename .txt.new .new.txt {} \;

是否可以解析 {} 来访问文件扩展名?类似于(我不确定):

-exec cp {} {$1}.new.txt \;
1个回答

3

我不确定是否能够完全按照您的要求进行操作,但可以使用shell对参数进行这种修改:

find /root/test -name "*.txt" -exec sh -c 'cp "$0" "${0%.txt}.new.txt"' "{}" \;

我会尝试分解一下,使其更易于理解:

-exec sh -c '<...>' "{}" \;

这将启动一个新的shell,执行在单引号内指定的脚本。另外要注意的是" {} "是发送到此脚本的参数,并将在该脚本中作为$0可用。

至于脚本本身,$0是匹配的文本文件,我们将其复制到${0%.txt} .new.txt中,它获取了文件名($0)并从文件名的末尾截取第一个匹配.txt的文本,留下没有扩展名的文件名。然后我们只需添加新文件名.new.txt即可。

补充说明,根据您的系统情况,您可能会收到“替换错误”消息(我在我的Mint安装上得到了这个消息,但在我的CentOS安装上没有)。如果您遇到此问题,请尝试将-exec sh更改为-exec bash


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接