你必须转义所有会被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 \;