我有一个带有文件名的文本文件,其中文件名包含各种格式的信息(例如,分辨率 4k、4K、2160、XxY 等),我想将文件重命名为单一一致的格式。
当我只做一种模式时,我一直在做如下(从脚本中摘录),但是有没有办法让我调整第 1 行以包含某种形式的具有多个子字符串的正则表达式(OR 运算符),或者更改第 3 行一些时尚。
line1: findhighresmarker=".4k."
line2: replaceWith=".2k."
line3: newFileName2K=${file//$findhighresmarker/$replaceWith}
当然,替代解决方案同样受到欢迎和赞赏。提前致谢
答案1
如果您想使用正则表达式重命名文件,请使用 perlrename
实用程序。根据您的操作系统/发行版,它可能被称为rename
、prename
、perl-rename
或file-rename
类似名称。
这是不是rename
与中的实用程序相同util-linux
,这是一个完全不同的程序,具有完全不同的功能和不兼容的命令行选项。
要查明您安装了哪个(如果有),请运行上面提到的一个或多个命令名称以及选项-V
。如果是 perl 重命名,它会提到“perl”或“File::Rename”。如果是util-linux
版本的话,它会提到这一点。在 Linux 系统上同时安装两者的情况并不少见,例如 util-linux 版本为rename
或rename.ul
,perl 版本为prename
或file-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/' ./*