代码之家  ›  专栏  ›  技术社区  ›  nick

向后交换文件名

  •  2
  • nick  · 技术社区  · 1 年前

    以下单行脚本用于重命名文件,例如。 Foo_Bar_Baz.txt Baz_Bar_Foo.txt :

    ( rename rename(1) 效用从 File::Rename .)

    rename -n 's/(\w+)_(\w+)_(\w+)/join "_", reverse @{^CAPTURE}/xe' ./*.txt
    

    它有效,但目前下划线分隔的组的数量是硬编码的。也就是说,该脚本适用于例如。 Foo_Bar_Baz ,但它不能正确处理 Foo_Bar Aaa_Bbb_Ccc_Ddd .

    如何调整它,使其能够处理任意数量的下划线分隔组?

    2 回复  |  直到 1 年前
        1
  •  4
  •   choroba    1 年前

    使用 split :

    rename -n 's{(.*)(?=\.txt$)}{ join "_", reverse split /_/, $1 }e' *.txt
    
        2
  •  1
  •   DuesserBaest    1 年前

    我不懂Perl,所以我用了 CodeConvert 将Python翻译成Perl。

    这个想法是在 . 分为前缀和后缀。然后将前缀拆分 _ 进入一个列表。反转列表并使用 _ .最后加后缀

    
    use strict;
    use warnings;
    
    my $s1 = "Aaa_Bbb_Ccc_Ddd.txt";
    my $s2 = "Baz_Bar_Foo.txt";
    
    sub reverse_prefix {
        my ($path) = @_;
        my ($prefix, $suffix) = split(/\./, $path);
    
        my @pf_elements = split(/_/, $prefix);
    
        my $pf_elements_rev = join("_", reverse @pf_elements);
    
        return "$pf_elements_rev.$suffix";
    }
    
    print reverse_prefix($s1), " ", reverse_prefix($s2);
    
    
    

    请参阅 onecompiler