重命名文件时替换和添加前导零

Posted

技术标签:

【中文标题】重命名文件时替换和添加前导零【英文标题】:Replace and add leading zeros when renaming files 【发布时间】:2012-10-26 09:15:47 【问题描述】:

请耐心等待,这篇文章会有点长...

我有一堆文件,其中一些文件名称简单明了(例如 1E01.txt),还有一些文件有很多附加内容:

Sample2_Name_E01_-co_032.txt
Sample2_Name_E02_-co_035.txt
...
Sample12_Name_E01_-co_061.txt

等等。这里重要的是“Sample”后面的数字和“Name”后面的字母+数字 - 其余的都是一次性的。如果我去掉不重要的部分,文件名将减少为与“干净”文件名(2E01.txt、2E02.txt、...、12E01.txt)相同的模式。我设法用以下表达式重命名了文件(我自己想出了这个,不知道是否非常优雅但工作正常):

rename -v 's/Sample([0-9]+)_Name_([A-Z][0-9]+).*/$1$2\.txt/' *.txt

现在,第二部分是为只有一位数字的文件名添加前导零,例如 1E01.txt 变成 01E01.txt。我已经设法做到这一点(在另一个 StackExchange 帖子中找到并修改了它):

rename -v 'unless (/^[0-9]2.*\.txt/) s/^([0-9]1.*\.txt)$/0$1/;s/0*([0-9]2\..*)/$1/' *.txt

所以我终于得到了我的问题:有没有办法在一个重命名命令中合并两个表达式?我知道我可以编写一个 bash 脚本来自动化这个过程,但我想要的是找到一个一次性重命名解决方案。

谢谢

【问题讨论】:

我不明白为什么您需要一个一次性解决方案来处理两个本质上不同的操作。如果需要,可以将两个命令放在同一行。 只追求优雅。而且它们不是不同的操作,都是重命名相同的文件。 @Tim N:事后思考:你是对的,因为我有两种类型的名字开头,我想我需要两种表达方式。 linux shell script to add leading zeros to file names的可能重复 【参考方案1】:

你可以试试这个命令将1-file.txt重命名为0001-file.txt

# fill zeros
$ rename 's/\d+/sprintf("%04d",$&)/e' *.txt

您可以稍微更改命令以满足您的需要。

【讨论】:

【参考方案2】:

好吧,如果那是您的“解析”正则表达式,那么您就是在限制脚本可以作用于与该模式匹配的文件。因此,sprintf 使用相同的文字字符串并不是更特殊的情况,您可以这样做:

sSample(\d+)_Name_(\pIsUpper)(\d+)
 sprintf "Sample%02d_Name_%s%03d", $1, $2, $3e
 ;

在这里,您再次使用相同的已知功能并简单地格式化随附的数字。

/e switch 用于 'eval' 并且它评估每个匹配的 Perl 替换。 我将您的一些表达式重命名为更标准的字符类符号:[A-Z] 变为属性类 \pIsUpper[0-9] 变为数字代码 \d(也可能是 \pIsDigit)。

【讨论】:

以上是关于重命名文件时替换和添加前导零的主要内容,如果未能解决你的问题,请参考以下文章

如何以照片的拍摄时间批量重命名文件

Git和文件重命名和替换

bat批量重命名(指定替换字符)

如何通过在 Windows 中使用批处理替换子字符串来重命名文件 [关闭]

怎么批量重命名多个文件夹里的图片

文件重命名时快速添加时间前缀