3

我正在尝试在 linux 中创建一个批处理文件,它允许我更改多个子目录中文件的扩展名。经过大量搜索和试验,我发现似乎是一个解决方案:

find /volume1/uploads -name "*.mkv" -exec rename .mkv .avi {} +

运行脚本时出现以下错误:

find: -exec CMD must end by ';'

我试过添加;和 \; (带或不带+)但无济于事。该命令有什么问题,我该如何解决?

编辑:在带有 DSM 4.2 的 Synology NAS 上运行

4

2 回答 2

0

您必须转义所有将由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 \;
于 2013-07-01T12:27:01.140 回答
0

不确定您的 DSM 4.2 操作系统上的命令find和命令有何不同,因此请尝试以下操作:rename

find /volume1/uploads -name "*.mkv" | while read filename; 
do mv -v "${filename}" "$(echo "${filename}" | sed -e 's/\.mkv$/\.avi/')"
done
于 2013-07-01T13:22:47.973 回答