Hallo Leute,
Ich würde gerne mein home-Verzeichnis mit meinem home-Verzeichnis in der Uni synchronisieren. Allerdings dürfen die Dateien auf den Uni-PCs keine Sonderzeichen haben und es wird dort nicht zwischen Groß- und Kleinbuchstaben unterschieden. Ich jedoch besitze viele Dateien mit Sonderzeichen im Namen.
Daher suche ich nach einem Script, dass folgendes kann:
Leerzeichen durch Unterstrich ersetzen.
Großbuchstaben in Kleinbuchstaben umwandeln.
Ä, ä, Ö, ö, Ü, ü und ß in ae, oe, ue und ss umwandeln.
" - " (also LeerzeichenBindestrichLeerzeichen) in "_" umwandeln.
Bei Dateien mit mehreren Punkten im Namen alle Punkte bis auf den Punkt am Schluss entfernen.
Allgemein alle Sonderzeichen entfernen, so dass nur noch a-z, 0-9, -, _ in den Namen stehen.
Per Google habe ich zwar viele Ergebnisse gefunden, wie z.B auf http://blog.commandlinekungfu.com/2009/04/episode-26-renaming-files-with-regular.html, allerdings sind diese nicht rekursiv.
Es wäre super, wenn ihr mir helfen könntet und vielleicht eure Lösung auch ein wenig erklärt, damit ich später das Script noch für andere spezielle Aufgaben anpassen kann, wie z.B. serie1, serie 2, serie3 ... serie10 in Serie_01, Serie_02, Serie_03 ... Serie_10 umbenennen.
Edit: Nach einiger Suche bin ich auf diese Lösung gestoßen:
#!/usr/bin/perl -w use strict; use File::Find; use File::Copy; #find \&wanted, @ARGV; for ( glob('*') ) { &wanted if -f; } sub wanted { return if /^\.\.?$/; my $orig = $_; my $ch; $ch++ if tr/A-Z/a-z/; $ch++ if s/ //g; $ch++ if s/ä/ae/g; $ch++ if s/ö/ou/g; $ch++ if s/ü/ue/g; $ch++ if s/\.(?!....?\z)//g; $ch++ if s/,/u/g; if ( $ch ) { if ( -e ) { print "Skipped: $orig => $_ : Zieldatei existiert bereits.\n"; } else { print "move: $orig => $_\n"; move $orig, $_ or warn "Error: move: $orig => $_ : $!\n"; } } }Einfach in eine Datei speichern (z.B.: persmove) und ausführbar machen (chmod u+x persmove). Entweder kopierst du das ganze in einem Verzeichniss das in der PATH variable steht, damit du den Befehl von überall aus aufrufen kannst. Ansonsten musst du den befehl mit einem Absoluten Pfad aufrufen (z.B.: /home/user/persmove). Es wird automatisch das aktuelle Verzeichnis durchgegangen und die Dateien so verändert wie du es wolltest. Wenn du Rekursiv alle Verzeichnisse durchgehen möchtest. Also auch alle unterverzeichnisse dann musst du
for ( glob('*') ) { &wanted if -f; }
kommentieren. (Mit einem '#' vor den Zeilen.)und dann dafür
#find \&wanted, @ARGV;auskommentieren (# am anfang entfernen).
Wenn du das machst musst du dem Befehl ein oder mehrere Verzeichnisse übergeben das du durcharbeiten möchtest. (/home/user/persmove /home). Würde also das komplett /home und alle Unterverzichnisse + Dateien verändern. Da musst du aufpassen, und ich rate dir auch eher das ganze nicht zu benutzen, auser du weißt genau was du tust.
Wenn du erstmal nur die Veränderungen sehen möchtest, ohne das etwas passiert musst du die "move $orig..." Zeile auskommentieren. Dann siehst du was passiert, aber ohne das eine aktion ausgeführt wird.
Benutzung erfolgt auf eigene Gefahr. \^^
Allerdings kommt bei mir, wenn ich das Skript auf rekursiv umstellen will, folgende Fehlermeldung im Terminal:
invalid top directory at /usr/share/perl/5.10/File/Find.pm line 598.
In der Zeile 598 steht folgendes:
die "invalid top directory" unless defined $_[0];
Desweiteren ersetzt bei mir der Skript nicht die groß geschriebenen ÄÖÜs, obwohl das i am Ende das doch bewirken sollte?