![使用 find 重命名文件时出现错误替换](https://linux22.com/image/78964/%E4%BD%BF%E7%94%A8%20find%20%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6%E6%97%B6%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%E6%9B%BF%E6%8D%A2.png)
我正在尝试使用递归地重命名图像文件find
命令。
目前,命令写法如下:
$ find . -name '*.jpg' -exec rename "${echo $(uuidgen) | cut -c1-8}.jpg" '{}' \;
它的错误是:
bash:
${echo $(uuidgen) | cut -c1-8}.jpg
: 错误的替换
我尝试过各种使用组合{}
,()
但似乎没有任何效果。如果我echo $(uuidgen) | cut -c1-8
单独运行,则会产生正确的结果,所以我只想简单地将这个字符串插入到图像名称中。
如果我按如下方式进行替换:
$ find . -name '*.jpg' -exec rename "$(echo $(uuidgen) | cut -c1-8).jpg" '{}' \;
该命令错误如下:
在 (eval 1) 第 1 行使用“strict subs”时不允许使用裸字“jpg”。
我该如何解决这些问题?
感谢您的帮助!
答案1
根据man rename
:
概要
重命名 [ -v ] [ -n ] [ -f ] perlexpr [ 文件 ]
描述
“rename”根据第一个参数指定的规则重命名提供的文件名。 perlexpr 参数是一个 Perl 表达式,预计至少会修改 Perl 中某些指定文件名的 $_ 字符串。如果给定的文件名未被表达式修改,则不会重命名。如果命令行上没有给出文件名,则将通过标准输入读取文件名。
因此第一个参数是一个正则表达式。您需要将第一个参数更改为匹配任何字符串的正则表达式并将其替换为:$(echo $(uuidgen) | cut -c1-8).jpg
find . -name '*.jpg' -exec rename 's/.*/$(echo $(uuidgen) | cut -c1-8).jpg/' '{}' \;
答案2
mv
只需使用rename
.
find . -name '*.jpg' -exec mv '{}' "$(echo $(uuidgen) | cut -c1-8).jpg" \;