将文件名中的多个子字符串替换为一个(bash 或 zsh)

将文件名中的多个子字符串替换为一个(bash 或 zsh)

我有一个带有文件名的文本文件,其中文件名包含各种格式的信息(例如,分辨率 4k、4K、2160、XxY 等),我想将文件重命名为单一一致的格式。

当我只做一种模式时,我一直在做如下(从脚本中摘录),但是有没有办法让我调整第 1 行以包含某种形式的具有多个子字符串的正则表达式(OR 运算符),或者更改第 3 行一些时尚。

line1: findhighresmarker=".4k."
line2: replaceWith=".2k."
line3: newFileName2K=${file//$findhighresmarker/$replaceWith}

当然,替代解决方案同样受到欢迎和赞赏。提前致谢

答案1

如果您想使用正则表达式重命名文件,请使用 perlrename实用程序。根据您的操作系统/发行版,它可能被称为renameprenameperl-renamefile-rename类似名称。

这是不是rename与中的实用程序相同util-linux,这是一个完全不同的程序,具有完全不同的功能和不兼容的命令行选项。

要查明您安装了哪个(如果有),请运行上面提到的一个或多个命令名称以及选项-V。如果是 perl 重命名,它会提到“perl”或“File::Rename”。如果是util-linux版本的话,它会提到这一点。在 Linux 系统上同时安装两者的情况并不少见,例如 util-linux 版本为renamerename.ul,perl 版本为prenamefile-rename

例如,在 Debian 上安装了两者:

$ rename.ul -V
rename.ul from util-linux 2.38.1

$ rename -V
/usr/bin/rename using File::Rename version 2.01

无论如何,要重命名您建议的模式,您可以使用如下内容:

rename -n 's/resolution 4k|3840x2160|2160/4k/' ./*

-n选项使其成为一次试运行,它只会打印要重命名的内容,而不会实际重命名任何内容。当您确定它会执行您想要的操作时,请删除-n或将其替换-v为详细输出。

您可以添加s///任意数量的替换操作,以分号字符分隔,它们将依次应用于每个文件名。事实上,您可以在rename脚本中使用任何有效的 Perl 代码(甚至变量和子例程,只要您注意变量范围 - 它在strict模式下运行)。例如,您可以编写一个重命名脚本来检查文件名,根据其匹配的模式设置变量,然后根据已设置的变量构造一个全新的文件名。

如果您使用的只是简单的替换操作,您可以将其视为类似于sed文件名。

例如

rename -n 's/resolution 4k|3840x2160|2160[pi]?/4k/;
           s/resolution 2k|2560x1440|1440[pi]?/2k/;
           s/1920x1080|1080[pi]?/HD/;
           s/720x480|480[pi]|4:3/SD/' ./*

相关内容