python - 以相反的顺序批量重命名目录

标签 python linux bash sed

我有一堆(超过 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

编辑:评论中有人建议让试运行先于真正的运行,所以我添加了一个参数 realtrial .对于第一个选项,它将进行真正的更改,而对于第二个选项,它将 print 输出真正的命令,但不运行它们。现在像这样运行脚本:

perl script.pl real

perl script.pl trial

关于python - 以相反的顺序批量重命名目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11561479/

相关文章:

python - AWS Glue Job Cloudformation - Cloudformation 中设置的值不固定

调用 execve()/execve() 时的 Linux kill 进程

linux - 在 Windows 上提取文件,然后复制到 Linux - LINUX 上文件格式的任何问题

c - 通过 shell 命令获取 C 应用程序的参数

python 无法识别 windows 10

python - 为什么这个来自 python 的 bash 调用不起作用?

python - 我可以在 XPath 中访问父级的子级吗?

linux - 删除Linux用户是否也会删除密码?

linux - 用 ASCII 空格替换字符串中的 HEX 字符 (\x20)

bash - 如果安装或未安装某些软件,如何检查 bash 脚本?