在 Linux 中更改文件的序列号

在 Linux 中更改文件的序列号

是否可以编写脚本来重命名一系列文件,如下所示:

  • sol-temp_0010.pngsol-temp_1.png
  • sol-temp_0015.pngsol-temp_2.png
  • sol-temp_0020.pngsol-temp_3.png

ETC。?

答案1

renamePerl 中包含的命令(因此许多 Linux 发行版也包含该命令)可以轻松完成此操作:

rename 's%(\d+)%$1/5-1%e' sol-temp_*.png

单引号之间的字符串被评估为 Perl 代码并用于修改每个文件名。

具体来说,s%foo%bar%是一个正则表达式匹配替换运算符。(通常人们会将其写为s/foo/bar/,但我想在替换中使用斜线,因此我选择了不同的分隔符。)正则表达式(\d+)匹配文件名中一个或多个数字的第一个序列并将其存储在$1替换的变量中。e末尾的开关使替换$1/5-1被评估为 Perl 代码,因此它返回存储在中的数字$1除以 10,减一。

如果你恰巧没有rename安装该命令(或者你的rename工作方式不同;有多个 Unix 命令使用该名称),但是你安装了 Perl,则可以得到几乎相同的效果,如下所示:

perl -e 'for (<sol-temp_*.png>) {$o = $_; s%(\d+)%$1/5-1%e; rename $o, $_}'

但请注意,此版本没有错误检查或防止覆盖文件的保护措施;这些并不难添加,但它们确实使代码对于一行代码来说有点太长了。不过,如果您不介意编写完整的脚本,那么类似这样的代码应该可以工作:

#!/usr/bin/perl
use strict;
use warnings;

foreach my $name (<sol-temp_*.png>) {
    my $orig = $name;

    $name =~ s%(\d+)%$1/5-1%e;   # map "0010" -> "1", "0015" -> "2", etc.

    next if $name eq $orig;
    warn "$0: $name exists, not renaming $orig\n" and next if -e $name;
    rename $orig, $name or warn "$0: error renaming $orig to $name: $!\n";
}

(您甚至可以轻松修改上面的脚本以从命令行读取替换代码和文件名,只需执行脚本rename即可,但这超出了本答案的范围。)

相关内容