根据目录名称重命名文件

根据目录名称重命名文件
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" \{\} \;

相关内容