Tipp: Suchen mit find
Das Zentrale Tool für die Suche nach Dateien auf einem Linux System ist der Befehl find.
Viele Anwender haben im ersten Moment Probleme mit find, da er sich nicht wie z. B. der
Befehl locate direkt mit dem dem gesuchten Dateinamen aufrufen lässt.
Aber fangen wir vorne an. Der einfachste Aufruf ist der Befehl ohne Parameter.
tux@linux ~ $ find
.
./Videos
./Dokumente
./.xinitrc
./.bash_logout
./Downloads
./.bash_profile
./.xsession
./Bilder
./Bilder/Camping
./Bilder/Camping/GISL9002.CR2
./Bilder/GISL9000.CR2
./Bilder/GISL9001.CR2
./Desktop
./.bashrc
./.zshrc
In diesem Fall listet find alle Dateien des lokalen Verzeichnisses (.) inklusive der
versteckten Dateien. Da es für versteckte Dateien in Linux Dateisystemen keine Attribute
gibt, wurde festgelegt, dass alle Dateien deren erstes Zeichen ein . ist von Befehlen wie
ls nicht angezeigt und damit versteckt werden.
Die ausgegebene Liste der Dateien ist nicht sortiert. find listet die Dateien und Verzeichnisse
in der Reihenfolge in der sie im Dateisystem hinterlegt sind.
Der erste Parameter des find Befehls ist der Verzeichnispfad in dem rekursiv gesucht
werden soll.
tux@linux ~ $ find /home/tux/Bilder
/home/tux/Bilder
/home/tux/Bilder/Camping
/home/tux/Bilder/Camping/GISL9002.CR2
/home/tux/Bilder/GISL9000.CR2
/home/tux/Bilder/GISL9001.CR2
Sowohl das Verzeichnis als auch die Dateien darin werden aufgelistet. Der Befehl arbeitet immer rekursiv. Das heisst es wird immer der komplette Verzeichnisbaum mit allen darin enthaltenen Verzeichnissen und Dateien durchsucht.
Um dieses Verhalten zu verändern kann mit den Parametern -mindepth und -maxdepth die Suchtiefe verändert
werden. Dieser Parameter erfordert ein numerisches Argument das die Tiefe angibt. Dabei steht
‘0’ für den angegeben Pfad, also das Startverzeichnis und ‘1’ für dessen Inhalt. Je höher der
Wert umso mehr Ebenen werden in die Suche einbezogen.
Mit dem folgenden Beispiel kann der Suchbereich auf den Inhalt des angegebenen Verzeichnisses ohne das Verzeichnis selber und den Inhalt von Unterverzeichnissen eingeschränkt werden.
tux@linux ~ $ find /home/tux/Bilder -mindepth 1 -maxdepth 1
/home/tux/Bilder/Camping
/home/tux/Bilder/GISL9000.CR2
/home/tux/Bilder/GISL9001.CR2
Leider bleibt bei diesem Beispiel das Verzeichnis Camping im Suchergebnis. Um das
Suchergebnis auf Dateien zu reduzieren kann der Typ der zu suchenden Dateien angegeben werden.
tux@linux ~ $ find /home/tux/Bilder -mindepth 1 -maxdepth 1 -type f
/home/tux/Bilder/GISL9000.CR2
/home/tux/Bilder/GISL9001.CR2
Nun werden nur noch alle Dateien angezeigt, die vom Typ ‘Datei’ (f) sind. Leider hat diese
Angabe auch einen kleinen Nachteil. Es werden zwar alle Verzeichnisse (d) ausgeblendet, aber
auch symbolische Links, Block-Devices, Character-Devices, Pipes und Sockets sind so nicht mehr
auffindbar. Sollen diese im Suchergebnis erscheinen, kann der Parameter -type über den
vorangestellten Parameter -not umgekehrt werden.
tux@linux ~ $ find /home/tux/Bilder -mindepth 1 -maxdepth 1 -not -type d
/home/tux/Bilder/GISL9000.CR2
/home/tux/Bilder/GISL9001.CR2
Das Suchergebnis enthält nun keine Dateien, die den Dateityp Verzeichnis haben.
Was bisher fehlt ist die Möglichkeit nach bestimmten Dateien zu suchen. Über den Filter
-name lässt sich ein Suchpattern angeben nach dem gesucht werden soll. Der folgende Befehl
sucht innerhalb des Homeverzeichnisses des Benutzers nach allen Dateien, die auf .CR2 enden.
tux@linux ~ $ find /home/tux -name '*.CR2'
/home/tux/Bilder/GISL9000.CR2
/home/tux/Bilder/Camping/GISL9002.CR2
/home/tux/Bilder/GISL9001.CR2
Wichtig ist bei der Benutzung der Suchpattern * und ?, dass doppelte oder einfache Anführungsstriche –
wie im Beispiel – benutzt werden, da ansonsten das Globbing der Shell
greift und das Suchmuster bereits vor der Ausführung verändert.
Neben dem Parameter -name lässt sich auch -iname für die Suche ohne Prüfung der
Groß-/Kleinschreibung nutzen. Für diejenigen, die lieber reguläre Ausdrücke benutzen gibt es
auch -regex und -iregex. Hierbei sollte aber zusätzlich über -regextype die RegEx -
Variante festgelegt werden. Die Manual Page zu find enthält die möglichen Parameter.
Nachdem nun die gewünschten Dateien gefunden wurden möchten wir auch damit arbeiten. Das
auflisten ist für den find nur die halbe Arbeit. Ohne zusätzliche Parameter ist immer die
Aktion -print vorgegeben. Sobald eine Aktion angegeben wird ersetzt diese die
Standardaktion.
Häufig genutzt ist die Aktion -exec um für jedes Suchergebnis eine Aktion ausführen zu
lassen. Um beispielsweise die Gruppe aller *.CR2 - Dateien zu verändern wird mit dem
folgenden Befehl sowohl ein -exec als auch ein -print ausgeführt. Der -exec selber hätte
keine Ausgabe, außer im Fehlerfall des chgrp Befehls, erzeugt.
tux@linux ~ $ find /home/tux -name '*.CR2' -print -exec chgrp bilder {} \;
/home/tux/Bilder/GISL9000.CR2
/home/tux/Bilder/Camping/GISL9002.CR2
/home/tux/Bilder/GISL9001.CR2
Alles nach dem -exec wird bis zum \; als auszuführender Befehl angesehen und von der Shell
des Benutzers ausgeführt. Die beiden Klammern {} sind Platzhalter für die Suchergebnisse.
find führt die Befehlszeile für jedes Suchergebnis einmal aus. Falls mehrere Befehlszeilen
für ein Suchergebnis ausgeführt werden soll, kann die Aktion -exec mehrfach angegeben
werden.
Obwohl wir bei den Suchen bisher nur die Suche nach Namen angesprochen haben ist es möglich
nach allen anderen Daten der Dateien mit Ausnahme des Dateiinhalts suchen zu lassen.
Dementsprechende Filter sind in der Manual Page zu finden. Ebenfalls können diese Daten für
die Ausgabe mit dem Parameter -printf genutzt werden.
Um die Dateigröße in Bytes und den Namen der Datei ohne Pfad ausgeben zu lassen reicht der Aufruf aus dem folgenden Beispiel.
tux@linux ~ $ find /home/tux -name '*.CR2' -printf "%s %f\n"
24932341 GISL9000.CR2
31099932 GISL9002.CR2
26415611 GISL9001.CR2
Die verschiedenen Dateiinformationen lassen sich über angegebenen Argumente auslesen. Die
komplette Liste gibt es auch hier wieder in der Manual Page. Das \n ist wichtig um den
Zeilenumbruch zwischen den Ausgabezeilen zu erzeugen.