如何通过删除特殊字符而不使用Linux shell中的重命名来批量重命名文件

che*_*976 3 bash mv

例如,我有 100 个文件,它们的名称都有空格。其中之一是“ The Monkey King Return (2015).mkv”。

如何删除名称中的所有空格并替换为点字符,同时删除“(”和“)”?

结果应该是“ The.Monkey.King.Return.2015.mkv”。

我怎样才能批量执行此操作?

我实际上是通过 ssh 在我的 Synology NAS 中运行 shell 脚本,这是一个 BusyBox Linux 发行版,安装了 bash 和 ash,没有 gcc。已经尝试了好几天了,无法正确弄清楚。

可用工具:mv / xargs / sed / awk /其他标准linux cmd。

另外,如何递归地重命名子文件夹呢?

编辑:刚刚使用https://synocommunity.com/的 Debian Chroot 安装了 apt-get 并将 cmd 重命名到我的 Synology nas 中,所以现在可以了。

为了让需要简单答案的人,命令是:

find . -iname \*\ \*.\*|rename 's/\ /\./g'
Run Code Online (Sandbox Code Playgroud)

Sjo*_*jon 5

大多数 Linux 发行版都包含util-linux,它为您提供了该rename命令。您可以通过运行以下命令来执行您请求的操作:

rename ' ' _ *.mkv
rename '(20' 20 *.mkv
rename ').' . *.mkv
Run Code Online (Sandbox Code Playgroud)

您可以尝试这些选项,它非常灵活。如果你想递归地执行此操作,请rename与 find 命令结合使用,如下所示:

find . -type f -name \*.mkv -exec rename ' ' _ {} \;
Run Code Online (Sandbox Code Playgroud)

这些在手册中都有解释;键入man findman rename阅读它们。


请注意,某些发行版显然包含接受 perl 正则表达式的不同命令。如果你的也这样做,你将需要稍微不同的语法:

rename 's/\ /./g' *.mkv
rename 's/[\)\(]//g' *.mkv
Run Code Online (Sandbox Code Playgroud)