shell - 批量重命名子目录中的文件扩展名

标签 shell unix automation busybox

我正在尝试在 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/

相关文章:

linux - 列出进程以有效方式访问的所有文件

bash - 从列剪切到行尾

linux - 如何自动化两层 SSH 和 docker exec?

java - 网上冲浪/浏览器自动化

linux - cp 命令根本不复制

Bash:非法变量名错误

linux - 如果在 shell 脚本中给出了子 ID,如何找到父 ID

java - 我如何将这个 bat 文件转换为 linux 加载 java 程序的 shell 脚本

c - 在C中获取当前进程CPU使用率

android - 我可以在没有目标应用程序的情况下运行 Appium for mobile 吗?