for i in L*;
do
cd $i
find . -type f -name 'botrytis_cinerea_T12345.*' -exec rename 's/botrytis_cinerea_T12345/"$i"/g' {} \;
done
我收到错误
find: missing argument to `-exec' rename: not enough arguments
Usage: rename [options] expression replacement file...
Options: -v, --verbose explain what is being done -s, --symlink act on symlink target
-h, --help display this help and exit -V, --version output version information and exit
For more details see rename(1).
答案1
有两个rename
具有不同语法的常见命令。您正在使用为接受 Perl 表达式的版本编写的脚本:
rename s/expression/replacement/g file...
但您安装的版本是同时接受正则表达式和替换字符串的版本,正如您看到的错误消息所示:
rename [options] expression replacement file...
(算你自己幸运,或者聪明,你使用了\;
而不是+
。)你可以通过调整你的find
命令来解决这个问题:
find . -type f -name 'botrytis_cinerea_T12345.*' -exec rename botrytis_cinerea_T12345 "$i" {} \;
正如 Kusalananda 在评论中指出的那样,您也在cd
循环内,但永远不会返回到原始目录,因此第一次迭代之后的每次迭代,您都会反复尝试cd
访问不存在的目录。您可能会尝试通过在cd
之后执行另一个操作来解决此问题find
,但我可能会尝试通过调整find
自身来避免这种情况:
for i in L*; do
find "$i" -type f -name 'botrytis_cinerea_T12345.*' -exec rename botrytis_cinerea_T12345 "$i" {} \;
done
也可以看看
答案2
单引号将停止扩展。并且 {} 可能需要转义,请改为执行以下操作:
find . -type f -name 'botrytis_cinerea_T12345.*' -exec rename "s/botrytis_cinerea_T12345/$i/g" \{\} \;