Find ist ein Wunderwuzi unter den Shellprogrammen. Der Name ist Programm, mit
find wird gefunden, nicht einfach nur gesucht.
Ein einfaches Beispiel:
Wo in meinem Homeordner liegt die Datei "test.pdf"?
find ~ -name test.pdf
Ihr habt vor ein paar Minuten eilig etwas gespeichert, habt aber den Namen der Datei und den Pfad sofort vergessen.
Irgendwo in eurem Homeordner, irgendein Name, vor ein paar Minuten...
find ~ -type f ! -path '*/.*' -mmin -10 -ls
Die Optionen im Einzelnen:
~ -- rekursiv in meinem Homeordner
-type f -- eine Datei (kein Ordner...)
! -path '*/.*' -- ohne Dateien oder Ordner, die mit Punkt beginnen.
-mmin -10 -- nicht älter als 10 Minuten
-ls -- lange Anzeige (wie ls -l)
Das war noch lange nicht alles...
Variante: mit Dotfiles, nicht aber Ordner, die mit Punkt beginnen (also ohne .gnome/ oder .kde/ usw., aber mit .bash_history). Und zwar alle Dateien, die nicht älter als zwei Tage sind.
find ~ ! -path '*/.*/*' -type f -ctime -2
Im Homeordner alle Dateien finden, deren Namen Leerzeichen enthalten.
Wieder ohne Dateien oder Ordner, die mit Punkt beginnen.
find $HOME ! -path '*/.*' -type f -name '* *'
$HOME -- ist gleichbedeutend mit ~
-name '
* *' -- Name enthält mindestens ein Leerzeichen
Ganz ähnlich, aber diesmal wird nach Ordnern gesucht:
find $HOME ! -path '*/.*' -type d -name '* *'
-type d -- Ordner (type directory)
Im Ordner public_html alle HTML und PHP Dateien ausfindig machen, in denen ".mp3" erwähnt wird.
Nur die Dateinamen ausgeben.
find ~/public_html \( -name \*.html -o -name \*.php \) | xargs grep -l '.mp3'
Zu beachten: ( ) * müssen vor der Bash versteckt, also mit Backslash escaped werden.
Andere Methode (-exec statt xargs), gleiches Ergebnis.
find ~/public_html \( -name \*.html -o -name \*.php \) -exec grep -l '.mp3' '{}' \+
Zu beachten: -exec mit
\+ abschließen statt mit
\; beschleunigt das Abarbeiten ungemein, weil dann mehrere grep Prozesse parallell gestartet werden (vgl. xargs). Setzt eine halbwegs aktuelle Version von find voraus.
Hoppla, da sind auch Dateien mit Leerzeichen im Namen dabei? Kein Problem.
find ~/public_html \( -name \*.html -o -name \*.php \) -print0 | xargs -0 grep -l '.mp3'
finds Option -print0 erzeugt die richtige Ausgabe für xargs Option -0
Anderer Einsatzzweck: Plattenplatz wird knapp, wo sind die großen Dateien?
Also z.B.: in meinem Homeordner alle Dateien, die größer als 500MB sind.
find ~ -size +500M
Nochmal was anderes:
Alle Dateien/Ordner in meinem Homeordner finden, die nicht mir gehören:
find ~ ! -user $( whoami ) -ls
Alle Dateien/Ordner in meinem Homeordner, die root gehören:
find ~ -user root
Alle Dateien/Ordner in meinem Homeordner, die die Rechte auf 777 gesetzt haben,
also Lese/Schreib/Ausführrechte für alle haben, lange Ausgabe wie "ls -l".
find ~ -perm 777 -ls
Welche Art von Dateien (Mimetype) liegen im Ordner Documents, mit Rücksicht auf Dateien mit Leerzeichen im Namen, nur in diesem Ordner, keine Unterordner:
find ~/Documents/ -maxdepth 1 -type f -print0 | xargs -0 file
Find sucht immer rekursiv, es sei denn, man schränkt mit "-maxdepth" die Tiefe ein.
Die Liste ließe sich beliebig fortsetzen. Wie vielseitig find ist, zeigt sich schon an der Länge der manpage.
Find findet nach Name, Regex, Größe, Datum, Dateityp,... usw. und läßt sich mit "-exec" und der Pipe für "xargs" zu beinahe allem verwenden, was nur auf bestimmte Dateien/Ordner angewendet werden soll. Darum wird das Kommando in vielen Shellskripten verwendet.
Zum Abschluss noch zwei Links zu find-Tutorials:
Was Übersichtliches zum Einstieg:
content.hccfl.edu/pollock/Unix/FindCmd.htm
Etwas komplexere Beispiele:
tldp.org/LDP/abs/html/moreadv.html