Code Schnipsel: Nicht-ASCII-Zeichen in Dateinamen ersetzen

Als ich dabei war mir einen Subsonic Server aufzusetzen, wollte ich auch endlich mal die Dateinamen meiner Musiksammlung überarbeiten. Nach dem Rippen mit EAC und der Benamung über freeDB fanden sich haufenweise Umlaute und andere Nicht-ASCII Zeichen in den Dateinamen der flacs, was in der Regel zwar kein Problem darstellt, aber eben doch nur in der Regel. Zwischen verschiedenen Dateisystem und über die eine oder andere Protokollkommunikation kann einem die Sache mit den verschiedenen Kodierungen von Nicht-ASCII Zeichen doch zum Verhängnis werden. (Allein schon Playlisten die von manchen Playern automatisch in ISO-8859 angelegt werden, aber dann doch am Ende auf Dateien auf einem UTF Dateisystem zugreifen.) Daher werden diese Non-ASCIIs nun verASCIIt.

Erstmal muss man die „Probleme“ finden. find und grep arbeiten da gut zusammen (wobei es find vielleicht auch alleine machen kann, aber so hab ich es für mich schneller hingekriegt, zumal man gleich die exakten Positionen der entsprechenden Zeichen sieht.

find | grep --color=auto -P -n "[\x80-\xFF]"

Dann kann man ans Ersetzen gehen. Eigentlich könnte man das gut skripten, doch da es sich um eine einmalige Sache handelt, bin ich den faulen Weg der Einzelkommandos gegangen.

find -exec rename "s/ä/ae/g" {} +

In diesem konkreten Anwendungsfall hat es sich als Vorteil erwiesen erst die Verzeichnisse zu behandeln (find -type d), aber man kann das gleiche Kommando auch mehrmals durchführen mit dem gleichen Endergebnis. Um auf Nummer sicher zu gehen, kann man auch erst einen Trockenlauf (rename -n) durchführen.

Das Ganze wäre sicherlich auch ein nettes Pythonskript geworden, doch ich will schnell Ergebnisse um überall meine Musik zu hören, also pfeif ich drauf.

Code Schnipsel: Skriptelemente global austauschen

Wenn man von einem Webserver auf einen anderen umzieht und dabei auch ein paar weniger gut programmierte Anwendungen umziehen muss, kann man auf das Problem stoßen, dass z.B. an zig Stellen der Serverpfad eingetragen ist. Kann man einzeln per Hand machen, muss man aber nicht:

find . -name '*.php' -type f -exec sed -i.bkp 's/\/alter\/pfad\/zu\/htdocs/\/neuer\/pfad\/zu\/htdocs/g' {} +

Durch ‚-i.bkp‘ bei sed werden auch Backups der Originaldateien angelegt, für den Fall, dass man es verbockt. Die lassen sich aber auch auf einen Schlag loswerden, nachdem alles auf saubere Funktion getestet wurde.

find . -name '*.php.bkp' -type f -exec rm {} \;