Umbenennen von Dateien nach Regulären Ausdrücken

Veröffentlicht am 19. May 2010

Ich hatte heute ein paar Dateien, die ich nach einem regulären Muster umbenennen musste.

Das das manuelle Umbenennen für einen Informatiker unwürdig ist und bei vielen Dateien schnell nervig und zeitfressend werden kann, habe ich schnell ein Perl-Script geschrieben, welches das für mich übernimmt.

Mir ist durchaus klar, dass es mit Bordmitteln schon möglich ist (find, sed, xargs und die dann irgendwie verknüpfen) und dass es vermutlich schon viele passenden Tools dafür gibt, aber ich habe keine Lust wegen sowas immer ewig lange in den Manuals rumzuwühlen, bis ich den Kommandozeilenbefehl dafür zurechtgebastelt habe.

Falls noch jemand mit dem Script was anfangen kann: Hier ist es:

#!/usr/bin/perl
#
# rename-s
# --------
# This tool can rename files by replacing parts of its filename by a replacement string.
# The filenames are matched against the regular expression and replaced with the replacement string.
# You can use group matchers $1-$9 in the replacement string.
#
# Feel free to use, copy, modify and distribute this code as you wish.
# 
# (c) 2010 Christian Simon, http://www.planet-metax.de

use File::Copy;

use strict;
use warnings;


if ($#ARGV < 3) {
  print "Synopsis:\n";
  print "  $0 file1 [file2 [file3 [...]]] regex replacement\n";
  print "\n";
  print "Renames the input files by doing search-and-replace on their filesnames.\n";
  print "The parameter regex has to be a perl-compatible regular expression and the parameter replacement can be any replacement string.\n";
  print "The group matchers \$1 - \$9 in the replacement string will be replaced by the n-th matched group in the regular expression.\n";
  print "\n";
  print "Example:\n";
  print "$0 \"01 Song1.mp3\" \"02 Song2.mp3\" \"([0-9]+) (.*\\.mp3)\" \"\$1 - Artist - \$2\"\n";
  print "'01 Song1.mp3', '02 Song2.mp3' --> '01 - Artist - Song1.mp3', '02 - Artist - Song2.mp3'\n";
  exit;
}

my ($regex, $replacement, @files) = ($ARGV[-2], $ARGV[-1], @ARGV);
pop(@files); pop @files;
my $numfiles = @files;

$replacement =~ s/\\([0-9])/\$$1/g;

for my $file(@files) {
  if (-f $file) {
    my $newfile = $file;
    eval '$newfile =~ s/' . $regex . '/' . $replacement . '/g;';
    if ($newfile ne $file) {
      print "'" . $file . "' -> '" . $newfile .  "'\n";
      move($file, $newfile);
    }
  } else {
    print "Warning: file $file was not found.\n"
  }
}
Kategorie: Perl