我有一堆(超过 700 个)目录以下列方式命名
1 - *random*name*1*
2 - *random*name*2*
...
725 - *random*name*725*
前导数字 (1-725) 都是目录名称的一部分。
即:所有目录名称均以数字开头,后跟 [空格][破折号][空格],再后跟一些文本。
我想批量重命名它们,这样它们将被命名为:
1 - *random*name*725*
2 - *random*name*724*
...
725 - *random*name*1*
我只想“反转”目录名称的数字部分。本质上,我希望“1 - ”之后的文本跟在“725 - ”之后,“2 - ”之后的文本跟在“724 - ”之后,依此类推。
最简单的方法是什么?我在 Linux 上。
注意:*随机*名称*各不相同,仅供说明之用。
最佳答案
使用 perl
的一种方式。代码已注释。
script.pl
的内容:
#!/usr/bin/env perl
use warnings;
use strict;
use File::Basename qw|basename|;
die qq{Usage: perl $0 <real|trial>\n} unless @ARGV == 1;
my $real = $ARGV[0] eq q|real| ? 1 : 0;
## Filter filenames from the directory that match criteria of OP.
my @files = grep { -d $_ && m/\A(\d+)\s-\s.*\1/ } map { basename $_ } <./*>;
## Get numbers in reverse mode to substitute them later in filenames .
my @nums = map { m/\A(\d+)/; $1 || 0 } reverse @files;
## Process all files, change the number of the file and rename it.
for my $file ( @files ) {
(my $new_file = $file) =~ s/\A(\d+)/shift @nums/e;
if ( $real ) {
rename $file, $new_file or warn qq|WARN: Couldn't rename "$file"\n|;
}
else {
printf qq|%s\n|, qq|rename "$file" "$new_file"|;
}
}
列出目录:
ls -1
输出如下:
1 - file1file
2 - fi2le
3 - fileeee3
4 - fou4r
5 - donttouch
6 - donttouch5either
script.pl
运行脚本:
perl script.pl
再次列出目录:
ls -1
输出如下:
1 - fou4r
2 - fileeee3
3 - fi2le
4 - file1file
5 - donttouch
6 - donttouch5either
script.pl
编辑:评论中有人建议让试运行先于真正的运行,所以我添加了一个参数 real
或 trial
.对于第一个选项,它将进行真正的更改,而对于第二个选项,它将 print
输出真正的命令,但不运行它们。现在像这样运行脚本:
perl script.pl real
或
perl script.pl trial
关于python - 以相反的顺序批量重命名目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11561479/