Find richtig benutzen
Aus Howtos und Gedankenstuetzen
find wird mit folgender Syntax aufgerufen:
find [Optionen] Startverzeichnis Test Aktion Beispiel: find / -name "[Xx]*"
Das Startverzeichnis kann ein absoluter oder relativer Pfad sein, muss aber auf jeden Fall angegeben werden. Möchte man das aktuelle Verzeichnis durchsuchen, so gibt man einfach einen Punkt (.) ein. Für die Tests gibt es verschiedene Möglichkeiten. -name durchsucht den Pfad nach Dateien, deren Name mit dem Muster übereinstimmt und ist wohl der am häufigsten gebrauchte Test. Für eine Auflistung aller Tests kann man im Manual nachschlagen.
Wird, wie im Beispiel, die Aktion weggelassen, führt find automatisch -print aus. Für alternative Möglichkeiten kann man wieder im Manual nachschlagen. Die Funktion -exec wird unten noch näher erklärt.
Gibt man zwei aufeinanderfolgende Tests an, so findet find alle Dateien, auf die beide Tests zutreffen.
find / -name "*.txt" -size +12k
findet also alle Dateien des gesamten Verzeichnisbaums, die auf .txt enden und mindestens 12 Kilobyte groß sind.
Inhaltsverzeichnis |
Numerische Werte
Ist das Suchkriterium bei find ein numerischer Wert, so gibt es einige Besonderheiten. Gibt man eine Zahl ohne Vorzeichen an, erhält man die Dateien, auf die die Zahl genau passt.
find . -size 24k
findet z.B. alle Dateien, die genau 24 Kilobyte groß sind. Ein Minus ist mit dem mathematischen Operator <= gleichzusetzen. Bei folgendem Befehl werden also alle Dateien gefunden, die höchstens 24 Kilobyte groß sind:
find . -size -24k
Umgekehrt findet ein + alle Dateien, die >= dem Wert sind.
find . -size +24k
findet also alle Dateien, die mindestens 24 Kilobyte groß sind.
exec
find kann Dateien nicht nur finden, sondern auch an andere Programme weiterleiten. Dafür gibt es die Aktion -exec. Will man z.B. alle Dateien, die Benutzern gehören, die nicht mehr existieren, löschen, so reicht der Befehl:
find / -nouser -exec rm {} \;
Nach der Aktion -exec folgt also der normale Programmaufruf für rm. Statt einer Datei existiert der Platzhalter {} (zwei geschweifte Klammern). Dieser steht für alle Dateien, die find findet. Abgeschlossen werden muss der Befehl mit \; (Backslash, Semikolon). Dabei existiert das Risiko, dass man Befehle ausführt, die man eigentlich gar nicht ausführen will. So könnte in unserem Beispiel eine Systemdatei nur fälschlicherweise mit einer nicht existierenden UID erstellt worden sein. Um das zu vermeiden, gibt es die Aktion -ok. Sie funktioniert genau wie -exec, fragt aber bei jeder Befehlszeile nach, ob sie ausgeführt werden soll.
ACHTUNG: Beachtet das vor den geschweiften Klammern und danach jeweils ein Leerzeichen ist. Ansonsten führt das ganze zu der Fehlermeldung:
find: missing argument to `-exec'
Hier ein Beispiel, wie man mit verschachtelten exec-Befehlen, automatische Archive erzeugen kann.
find . -mtime +$1 -type d -maxdepth 1 -exec echo erstelle {}.tar.bz2... \; -exec tar cjf {}.tar.bz2 {} \; -exec echo fertig \; -exec test -f {}.tar.bz2 \; -exec rm -r {} \;
Erläiterung:
Der find-Befehl sucht mit der Option mtime und type nach Verzeichnissen, die älter sind als n Tage (n ist der erste Parameter von der Kommandozeile). Die Option maxdepth sorgt dafür, dass keine Unterverzeichnise ausgegeben werden. Anschließend wird mittels tar-Befehl ein bz2-Archiv erzeugt, geprüft ob es angelegt wurde und bei Erfolg wird das Ursprungsverzeichnis gelöscht (dazwischen werden Statusnachrichten ausgegeben).
Weitere Suchprogramme
Unter Unix gibt es ein paar weitere Suchprogramme.
grep
Grep _grundlagen durchsucht einzelne Zeilen auf passende Ausdrücke.
locate
locate funktioniert ähnlich wie find, durchsucht aber nicht das Dateisystem sondern eine Datenbank, meist /var/lib/locatedb. Diese Datenbank ist eine Textdatei, in der für jede Datei des Systems eine Zeile existiert. Die Datenbank wird mit dem Befehl updatedb aktualisiert. Meist wird die Aktualisierung, weil zeitaufwendig, per cron durchgeführt.
locate arbeitet schneller als find, ist aber nur so aktuell wie die Datenbank.
Beispiele
find . -type f -size +10000 -exec ls -al {} \;
find . -atime +1 -type f -exec mv {} TMP \; # mv files older then 1 day to dir TMP
find . -name "-F" -exec rm {} \; # a script error created a file called -F
find . -exec grep -i "vds admin" {} \;
find . \! -name "*.Z" -exec compress -f {} \;
find . -type f \! -name "*.Z" \! -name ".comment" -print | tee -a /tmp/list
find . -name *.ini
find . -exec chmod 775 {} \;
find . -user xuser1 -exec chown -R user2 {} \;
find . -name ebtcom*
find . -name mkbook
find . -exec grep PW0 {} \;
find . -exec grep -i "pw0" {} \;
find . -atime +6
find . -atime +6 -exec ll | more
find . -atime +6 -exec ll | more \;
find . -atime +6 -exec ll \;
find . -atime +6 -exec ls \;
find . -atime +30 -exec ls \;
find . -atime +30 -exec ls \; | wc -l
find . -name auth*
find . -exec grep -i plotme10 {};
find . -exec grep -i plotme10 {} \;
find . -ls -exec grep 'PLOT_FORMAT 22' {} \;
find . -print -exec grep 'PLOT_FORMAT 22' {} \;
find . -print -exec grep 'PLOT_FORMAT' {} \;
find . -print -exec grep 'PLOT_FORMAT' {} \;
find ./machbook -exec chown 184 {} \;
find . \! -name '*.Z' -exec compress {} \;
find . \! -name "*.Z" -exec compress -f {} \;
find /raid/03c/ecn -xdev -type f -print
find /raid/03c/ecn -xdev -path -type f -print
find / -name .ssh* -print | tee -a ssh-stuff
find . -name "*font*"
find . -name hpmcad*
find . -name *fnt*
find . -name hp_mcad* -print
find . -grep Pld {} \;
find . -exec grep Pld {} \;
find . -exec grep Pld {} \;
find . -exec grep PENWIDTH {} \; | more
find . -name config.pro
find /raid -type d ".local_sd_customize" -print
find /raid -type d -name ".local_sd_customize" -print
find /raid -type d -name ".local_sd_customize" -ok cp /raid/04d/MCAD-apps/I_Custom/SD_custom/site_sd_customize/user_filer_project_dirs {} \;
find /raid -type d -name ".local_sd_customize" -exec cp /raid/04d/MCAD-apps/I_Custom/SD_custom/site_sd_customize/user_filer_project_dirs {} \;
find . -name xeroxrelease
find . -exec grep xeroxrelease {} \;
find . -name xeroxrelease* -print 2>/dev/null
find . -exec grep -i xeroxrelease {} \;
find . -print -exec grep -i xeroxrelease {} \;
find . -print -exec grep -i xeroxrelease {} \; > xeroxrel.lis
find . -exec grep -i xeroxrel {} \;
find . -print -exec grep -i xeroxrel {} \;
find . -print -exec grep -i xeroxrel {} \; | more
find /raid/03c/inwork -xdev -type f -print >> /raid/04d/user_scripts/prt_list.tmp
find . -exec grep '31.53' {} \;
find . -ls -exec grep "31/.53" {} \; > this.lis
find . -print -exec grep "31/.53" {} \; > this.lis
find . -print -exec grep 31.53 {} \; > this.lis
find . -exec grep -i pen {} /;
find . -exec grep -i pen {} \;
find . -print -exec grep -i pen {} \; | more
find . -exec grep -i pen {} \;
find . -atime +6 -exec ll | more \;
find . -atime +6 -exec ll \;
find . -atime +6 -exec ls \;
find . -atime +30 -exec ls \;
find . -atime +30 -exec ls \; | wc -l
find . \! -name '*.Z' -exec compress -f {} \;
find . -name 'cache*' -depth -exec rm {} \;
find . -name 'cache*' -depth -print | tee -a /tmp/cachefiles
find . -name 'cache[0-9][0-9]*' -depth -print | tee -a /tmp/cachefiles
find . -name 'hp_catfile' 'hp_catlock' -depth -print | tee -a /tmp/hp.cats
find . -name 'hp_catfile' -name 'hp_catlock' -depth -print | tee -a /tmp/hp.cats
find . -name 'hp_cat*' -depth -print | tee -a /tmp/hp.cats
find . -name 'hp_cat[fl]*' -depth -print | tee -a /tmp/hp.cats
find /raid -name 'hp_cat[fl]*' -depth -print
find . \! -name '*.Z' -exec compress -f {} \;
find . -name '*' -exec compress -f {} \;
find . -xdev -name "wshp1*" -print
find . -xdev -name "wagoneer*" -print
find . -name "xcmd" -depth -print
find /usr/contrib/src -name "xcmd" -depth -print
find /raid -type d -name ".local_sd_customize" -exec ls {} \;
find /raid -type d -name ".local_sd_customize" \
-exec cp /raid/04d/MCAD-apps/I_Custom/SD_custom/site_sd_customize/user_filer_project_dirs {} \;
Kategorien: Find | Locate | Bash