您必须转义所有将由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 \;