find und xargs
find und xargs sind zwei Programme, die sehr gut Zusammenarbeiten. Wenn man sie kombiniert kann man z.B. alle Dateien die ein @ im Namen haben löschen, oder alle Dateien die .m3 als Endung haben in .mp3 umandeln. Also hier eine kleine Einführung:
Wenn man find auf der Kommandozeile eingibt, listet es alle Dateien und Ordner im aktuellen Verzeichnis und dessen Unterverzeichnissen auf. Man kann find aber auch als Argument das zu durchsuchende Verzeichnis geben. Normalerweise will man etwas bestimmtes suchen, dafür gibt es die Option -name gesucht so kann man z.B. mit
find -name *.m4a alle m4a-Dateien aufspüren. Es gibt noch sehr viel mehr Möglichkeiten, bis hin zu dem ansehen von Änderungsdaten, aber diese kann man bequem in der Manpage von find oder per yelp man:find nachlesen.
Eine Option ist aber hier noch wichtig: -print0 bringt find dazu die Dateinamen von Null-Bytes getrennt auszugeben, die Möglichkeit, die xargs am besten versteht. Allerdings muss man auch xargs ersteinmal klar machen, dass die Dateinamen durch Nullen getrennt sind. Das tut man mit der Option -0. Bis jetzt sieht der Befehl so aus:
find . -name *.m4a -print0 | xargs -0
Das ist schön und gut, allerdings bringt es bis jetzt überhaupt nichts: Das Kommando das auf alle Dateien ausgeführt werden soll, fehlt. Dieses kann jetzt einfach dahinter notiert werden, ohne Pipe (|):
find . -name *.m4a -print0 | xargs -0 rm
löscht alle m4a-Dateien. Was man nun damit macht bleibt einem selber überlassen. Man könnte z.B. alle Dateien mit shred löschen oder wasweisich tun. Sehr praktisch ist allerdings das Umbenennen mit Perl-Skript. Es nimmt einen regulären Ausdruck entgegen und nennt die Datei um:
#!/usr/bin/perl
$expr = shift;
foreachmy $file (@ARGV){
$file=shift;
$new = $file;
eval “\$new =~ $expr”;<
rename($file,$new);<
}
Dieses Skript kann man speichern und ausführbar machen, und dann statt die m4a-Dateien zu löschen, sie z.B, alle nach .m4b umbenennen:
find . -name *.m4a -print0 | xargs -0 rename.pl s/m4a/m4b/
Wer das oft benötigt, kann sich einfach ein Shell-Skript schreiben:
#!/bin/sh
find $1 -type f -print0 | xargs -0 rename.pl s/$2/$3/
Das -type f gibt an, dass nur reguläre Dateien gesucht sind, man kann es einfach weglassen, wenn man z.B. auch Ordner umbenennen will. Dieses Skript wird folgendermaßen aufgerufen:
recursivemv verzeichnis suchen ersetzen
Wobei recursivemv der Name des gespeicherten Skriptes ist. Natürlich müssen beide Skripte in einem Verzeichnis, welches dem PATH angehört liegen (falls sie unsicher sind, kopieren sie sie als root nach /bin).





Kommentare
(verstecken) RSSGib deine Meinung ab!