0

我在一个目录中有多个顺序文件命名,具有多个增量文件扩展名。我的目标是使用重命名命令重命名文件扩展名。

IBM0020.DAT_001
IBM0020.DAT_002
IBM0020.DAT_003
IBM0021.DAT_001
IBM0021.DAT_002
IBM0022.DAT_001
IBM0022.DAT_002
IBM0022.DAT_003
IBM0022.DAT_004
...

IBM0020.DAT_001
IBM0020.DAT_002
IBM0020.DAT_003    
IBM0021.DAT_004
IBM0021.DAT_005
IBM0022.DAT_006
IBM0022.DAT_007
IBM0022.DAT_008
IBM0022.DAT_009
...

我已经试运行了下面的命令,但不是预期的结果。我想保留文件名,只重命名/更改带有运行编号序列的扩展名。

rename -n 's/.+/our $i;sprintf(".DAT_%03d",1+$i++)/e' *
IBM0020.DAT_001 renamed as .DAT_001
IBM0020.DAT_002 renamed as .DAT_002
IBM0020.DAT_003 renamed as .DAT_003
IBM0021.DAT_001 renamed as .DAT_004
IBM0021.DAT_002 renamed as .DAT_005
IBM0022.DAT_001 renamed as .DAT_006
IBM0022.DAT_002 renamed as .DAT_007
IBM0022.DAT_003 renamed as .DAT_008
IBM0022.DAT_004 renamed as .DAT_009

谢谢你的帮助。

4

1 回答 1

1

继续评论,如果您的所有文件都具有.DAT_XXX您希望按顺序重命名的扩展名,则无需将其包含".DAT_"为您匹配的模式的一部分。只需匹配文件名末尾的 3 位数字并更改它们,例如

rename 's/\d{3}$/our $i; sprintf("%03d", 1+$i++)/e' *

如果".DAT_"不是唯一的,并且您有其他以 3 位数结尾的扩展名要避免重命名,那么您可以将"DAT_"其作为匹配和替换模式的一部分包括在内,例如

rename -n 's/DAT_\d{3}/our $i; sprintf("DAT_%03d", 1+$i++)/e' *

注意:rename Linux 上常用的有两种不同的“ ”实用程序,第一个作为util-linux软件包的一部分提供不支持正则表达式重命名,然后perl-rename,你有,它支持 perl-regex 重命名。)

于 2019-06-28T04:46:28.233 回答