您必须转义所有将被bash 解释的字符。在您的情况下,这些是分号和 花括号(您忘记在代码中转义后者):
find /volume1/uploads -name "*.mkv" -exec rename .mkv .avi \{\} \;
{}(在我们的例子中为\{\})扩展为文件名,所以实际调用看起来像rename .mkv .avi /volume1/uploads/foo/bla.mkv(这不是/usr/bin/rename需要的确切语法,至少在我的系统上) .
相反,它会是这样的:
find /volume1/uploads -name "*.mkv" -exec rename 's/\.mkv$/.avi/' \{\} \;
更新
如果您不想(或不能)使用 perl 的 rename 脚本,您可以使用以下简单的 bash 脚本并将其保存为 /tmp/rename.sh
#!/bin/sh
INFILE=$1
OUTFILE="${INFILE%.mkv}.avi"
echo "moving ${INFILE} to ${OUTFILE}"
mv "${INFILE}" "${OUTFILE}"
使其可执行 (chmod u+x /tmp/rename.sh) 并调用:
find /volume1/uploads -name "*.mkv" -exec /tmp/rename.sh \{\} \;
更新2
原来这个问题真的不是bash的问题,而是busybox的问题。
使用像busybox这样有限的shell解释器,最简单的解决方案就是追加新的文件扩展名:
find /volume1/uploads -name "*.mkv" -exec mv \{\} \{\}.avi \;