Bulk renaming of files based on lookup

前端 未结 9 469
忘掉有多难
忘掉有多难 2020-12-11 05:55

I have a folder full of image files such as

  • 1500000704_full.jpg
  • 1500000705_full.jpg
  • 1500000711_full.jpg
  • 1500000712_full.jpg
9条回答
  •  一整个雨季
    2020-12-11 06:45

    This will work for your problem:

    #!/usr/bin/perl
    while () {
        my($new, $old) = split;
        rename("$old.jpg", "$new.jpg")
            || die "can't rename "$old.jpg", "$new.jpg": $!";
    }
    __END__
    SH103239 1500000704
    SH103240 1500000705
    SH103241 1500000711
    SH103242 1500000712
    SH103243 1500000714
    SH103244 1500000744
    SH103245 1500000745
    SH103252 1500000802
    SH103253 1500000803
    SH103254 1500000804
    

    Switch to ARGV from DATA to read the lines from a particular input file.

    Normally for mass rename operations, I use something more like this:

    #!/usr/bin/perl
    # rename script by Larry Wall
    #
    # eg:
    #      rename 's/\.orig$//'  *.orig
    #      rename 'y/A-Z/a-z/ unless /^Make/'  *
    #      rename '$_ .= ".bad"'  *.f
    #      rename 'print "$_: "; s/foo/bar/ if  =~ /^y/i'  *
    #      find /tmp -name '*~' -print | rename 's/^(.+)~$/.#$1/'
    
    ($op = shift) || die "Usage: rename expr [files]\n";
    
    chomp(@ARGV = ) unless @ARGV;
    
    for (@ARGV) {
        $was = $_;
        eval $op;
        die if $@;  # means eval `failed'
        rename($was,$_) unless $was eq $_;
    }
    

    I’ve a more full-featured version, but that should suffice.

提交回复
热议问题