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.