是否可以编写脚本来重命名一系列文件,如下所示:
sol-temp_0010.png
到sol-temp_1.png
sol-temp_0015.png
到sol-temp_2.png
sol-temp_0020.png
到sol-temp_3.png
ETC。?
答案1
这rename
Perl 中包含的命令(因此许多 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
即可,但这超出了本答案的范围。)