我正在尝试在 Linux 中创建一个批处理文件,它允许我更改多个子目录中文件的扩展名。经过大量搜索和试验后,我发现似乎是一个解决方案:
find /volume1/uploads -name "*.mkv" -exec rename .mkv .avi {} +
运行脚本时出现以下错误:
find: -exec CMD must end by ';'
我试过添加 ;和\; (有或没有+)但无济于事。该命令有什么问题,我该如何解决?
编辑:在装有 DSM 4.2 的 Synology NAS 上运行
最佳答案
您必须转义所有将被 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
的。
使用有限的 shell 解释器,如 busybox,最简单的解决方案就是附加新的文件扩展名:
find /volume1/uploads -name "*.mkv" -exec mv \{\} \{\}.avi \;
关于shell - 批量重命名子目录中的文件扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17404414/