find

Aus Mikiwiki
Zur Navigation springen Zur Suche springen

Der Shell-Befehl find dient zum Finden von Dateien und Verzeichnissen. Bei jeder Abfrage wird direkt das Dateisystem durchsucht, wobei die Suche nach zahlreichen Kriterien wie beispielsweise Besitzer, Grösse, Ort Zugriffsdatum und Änderungsdatum eingeschränkt werden kann. find ist Teil des POSIX-Standards und als solcher im Standardumfang jeder Unix-Variante zu finden.

Optionen

Option Beschreibung
() Eine Gruppe von logischen Ausdrücken und Operatoren in Klammern (diese müssen unter Umständen mit Backslash entwertet werden)
! Die Negation eines logischen Ausdrucks, entspricht dem Operator NOT.
-a Die UND-Verknüpfung von logischen Ausdrücken. Werden mehrere logische Ausdrücke hintereinander geschrieben, wird dies implizit als UND interpretiert.
-o Die ODER-Verknüpfung von logischen Ausdrücken.
-name file Suche nach der Datei "file", wobei Gross- und Kleinschreibung berücksichtigt wird.
-iname file Suche nach der Datei "file", wobei Gross- und Kleinschreibung nicht berücksichtigt wird.
-size Suche nach Dateien die grösser (+) oder kleiner (-) als der angegebene Wert in Byte (c) oder KByte (k) sind
-type Suche nach Dateien eines bestimmten Typs: einfache Dateien (f), Verzeichnisse (d), symbloische Links (l)
-atime Suche nach Dateien, auf die seit mehr (+) oder weniger (-) als die angegebene Anzahl Tage nicht mehr zugegriffen wurde
-amin Suche nach Dateien, auf die seit mehr (+) oder weniger (-) als die angegebene Anzahl Minuten nicht mehr zugegriffen wurde
-mtime Suche nach Dateien, die seit mehr (+) oder weniger (-) als die angegebene Anzahl Tage nicht mehr verändert wurden
-mmin Suche nach Dateien, die seit mehr (+) oder weniger (-) als die angegebene Anzahl Minuten nicht mehr verändert wurden
-perm Suche nach Dateien mit den angegebenen Zugriffsrechten, die als vierstellige Oktalzahl anzugeben sind
-user Suche nach Dateien des angegebenen Benutzers
-exec command "{}" ";"
oder
-exec command \{\} \;
Ausführen des Befehls "command" mit den gefundenen Dateien als Parameter. Die geschweiften Klammern stehen dabei für den aktuell gefundenen Dateinamen.
-ok command "{}" ";"
oder
-ok command \{\} \;
Ausführen des Befehls "command" mit den gefundenen Dateien als Parameter, wobei rückgefragt wird. Die geschweiften Klammern stehen dabei für den aktuell gefundenen Dateinamen.

Verwendung

Rekursives Finden aller Dateien im aktuellen Verzeichnis.

$ find

Rekursives Finden aller Dateien im aktuellen Verzeichnis. Angezeigt wird für jede Datei der Name ohne Pfad sowie die Grösse in Byte.

$ find -printf "%f %s\n"
$ find / -name filename -print
$ find /home -name filename -print
$ find /home /home1 -name filename -print
$ find / -name filename -print 2> /dev/null

Finden aller Dateien im ganzen Dateisystem, die auf ".log" oder ".aux" enden.

$ find / -name \*.log -o -name \*.aux -print

Finden aller Dateien unterhalb des aktuellen Verzeichnisses, die in den letzten zwei Tagen verändert wurden.

$ find . -mtime -2 -print

Finden aller normalen Dateien (keine Punkt-Dateien) im aktuellen Verzeichnis, die seit 30 Tagen nicht mehr verändert wurden, und löschen dieser Dateien ohne Rückfrage.

$ find . -type f -mtime +30 -exec rm -f {} \;

Finden von Dateien, die zwischen 18:05 und 18:15 geändert wurden.

$ find . -type f -newermt "2016-03-22 18:05:00" \! -newermt "2016-03-22 18:15:00" -exec ls -al {} \;

Finden und Informationsanzeige für alle Dateien im Verzeichnis "/home" mit dem Namen "filename".

$ find /home -name filename -exec ls -al {} \;

Anzeige der gefundenen Dateien mit Namen "core" mit Hilfe des Befehls "ls -ld".

$ find / -name core -exec ls -ld {} \;

Finden aller Dateien unterhalb des aktuellen Verzeichnisses, die auf ".txt" enden, dem Benutzer "mik" gehören und höchstens sieben Tage alt sind. Der Inhalt der gefundenen Dateien wird jeweils nach Rückfrage durch den Befehl "cat" angezeigt.

$ find . -name "*.txt" -user mik -atime -7 -ok cat {} \;

Anzeige aller Dateien über 500 Blöcke mit genauer Dateigrösse.

$ find / -size +500 -exec ls -al {} \;

Finden und Löschen aller Dateien im aktuellen Verzeichnis mit der Grösse von Bytes.

$ find . -type f -size 109269c -exec rm {} \;

Finden und Löschen aller Dateien im Verzeichnis "/home" mit dem Namen "filename". Der gefundene Dateiname mit seinem Pfad wird bei der Ausführung zwischen die geschweiften Klammern gesetzt.

$ find /home -name filename -exec rm {} \;

Finden und Löschen aller Dateien im Verzeichnis "/home" mit dem Namen ".rhosts", die nicht die Berechtigung 600 haben.

$ find /home -name .rhosts -a ! -perm 0600 -exec rm {} \;

Alle Dateien vom Typ "d" (also Verzeichnisse) unterhalb des aktuellen Verzeichnisses erhalten die Berechtigung 755.

$ find . -type d -exec chmod 755 {} \;

Anzeige einer Liste der Verzeichnisse, die mit "o" beginnen, während Fehlermeldungen ins Datennirwana geschickt werden. Der Befehl wird im Hintergrund ausgeführt.

$ find / -type d -name o\* -print 2> /dev/null &
$ find / -type d -name 'o*' -print 2> /dev/null &

Anzeige aller Dateien, deren setUID-bit gesetzt ist.

# find / -perm +4000

Anzeige aller Dateien im Verzeichnis "/usr", die dem Benutzer "root" gehören und deren setUID-bit gesetzt ist. Fehlermeldungen werden unterdrückt.

# find /usr \( -perm -4000 -a -user root \) -print 2>/dev/null

Anzeige aller Dateien im Verzeichnis "/usr", die dem Benutzer "root" gehören und deren setUID-bit gesetzt ist. Anzeige aller Informationen. Fehlermeldungen werden unterdrückt.

$ find /usr \( -perm -4000 -a -user root \) -ls 2>/dev/null

Ausgehend vom aktuellen Verzeichnis werden alle Unterverzeichnisse (Dateien vom Typ "d") angezeigt, die dem Benutzer "root" gehören.

# find . \( -type d -a -user root \) -print

Anzeige aller Dateien in "$PATH", deren setUID-bit gesetzt ist.

# find $(echo $PATH | tr ':' ' ') -type f -perm +4000

Anzeige aller Dateien mit den Rechten 755. Anzeige aller Informationen.

$ find /usr \( -perm -755 -a -user root \) -ls 2>/dev/null

Anzeige aller Dateien im Heimatverzeichnis des aktuellen Benutzers, die in den letzten 24 Stunden verändert wurden.

$ find ~ -type f -mtime -1 -print

Anzeige aller Dateien, die in den letzten 20 Stunden (1'200 Minuten) verändert wurden und Anzeige mit qiv.

$ for i in $(find . -type f -cmin -1200 -print); do qiv -m $i; done

Anzeige aller Dateien über 1'000'000 Byte im Verzeichnis "/home".

$ find /home -size +1000000c -print

Anzeige aller Dateien mit Endung ".tmp". Diese werden hintereinander in die Datei "/tmp/alltemp.log" geschrieben.

$ find / -name *.tmp -print | xargs echo " " > /tmp/alltemp.log

Wechsel ins Verzeichnis "/var/spool" und Suche nach allen einfachen Dateien ("f"), wobei symbolischen links gefolgt wird. Die gefundenen Dateien werden anschliessend mit cpio in die Datei "sisisSpool.cpio" ins Heimatverzeichnis geschrieben.

$ cd /var/spool
$ find sisis -type f -follow | cpio -o -a -B -c -L > ~/sisisSpool.cpio

Anzeige aller Dateien mit Endung ".tmp". Diese werden zeilenweise in die Datei "/tmp/alltemp.log" geschrieben.

$ find / -name *.tmp -print > /tmp/alltemp.log

Liste aller Dateien im Besitz von Benutzer "mik".

$ find / -type f -user mik 2> /dev/null

Liste aller Dateien im Besitz des aktuellen Benutzers.

$ find / -type f -user $LOGNAME 2> /dev/null

Liste aller Dateien mit 27. Januar als Änderungsdatum.

$ find / -type f -ls | grep 'Jan 27'

Liste aller leeren Verzeichnisse.

$ find . -type d -empty -print

Liste aller Dateien, die im Namen die Zeichenfolge "php" enthalten.

$ find . -print | grep -i php

Liste aller Dateien von Linux-Benutzer "sisis", ausser denjenigen, die sich im Verzeichnis "/SOFTWARE" befinden.

$ find / -path /SOFTWARE -prune -o -user sisis -print

Auschluss des Verzeichnisses "/ABC" aus der Suche.

$ find / -path /ABC -prune -o -name "Tm*" -print

Ausschluss mehrerer Verzeichnisse aus der Suche.

$ find / -type d \( -path /ABC -o -path /XYZ \) -prune -o -print
z. B.
$ find / -type d \( -path /dev -o -path /var/lib -o -path /sys -o -path /proc -o -path /var/run -o -path /var/spool/postfix -o -path /OCLC \) -prune -o -mtime -1 -print

Erstellen von 16-bit-Prüfsummen für alle Dateien im Verzeichnis "/usr". Das Ergebnis wird in die Datei "os_database.txt" geschrieben.

# for i in $(find /usr -type f -print); do sum ${i} >> os_database.txt; done

Suche nach Dateigrösse

Finden aller Dateien ab dem aktuellen Verzeichnis von einer Grösse von genau 99'080 Bytes.

$ find . -type f -size 99080c -exec ls {} \;

Suche nach Zeitstempel

Finden aller Dateien, welche in den letzten drei Tagen (genauer: 72 Stunden) angefasst wurden. find orientiert sich dabei nicht an durch Mitternacht getrennten Tagen, sondern denkt in 24 Stunden-Zyklen. Akzeptiert werden damit alle Zugriffe innerhalb der 24 Stunden-Periode, also Veränderungen vor 49 bis 72 Stunden. Die Manpage erklärt den Unterscheid zwischen "+3", "-3" und "3".

$ find . -mtime 3

Beispiele

Das Skript "videomove"

  1. durchsucht vom aktuellen Verzeichnis aus alle Unterverzeichnisse nach Dateien mit der Endung ".avi"
  2. Aus dem Pad zur Datei und ihrem Namen wird ein Name erzeugt, z. B. wird "./Walker, Scott/video anthology [DivX].avi" zu "Walker, Scott - video anthology [DivX].avi"
  3. Die Datei wird verschoben und mit dem zuvor erzeugten Namen in einem vorgegebenen Verzeichnis gespeichert.
#!/bin/bash

# Path where to move the files (without trailing /)
MOVEPATH=/VIDEO

for x in asf asx avi AVI divx flv mov mpeg mpg vob wmv
  do
  find . -name "*.${x}" -print | while read i
    do
    # echo "${i}"
    NEWNAME="$(echo "${i}" | sed -e 's/^\.\///' -e 's/\// - /g')"
    echo "${NEWNAME}"
    mv -i "${i}" ${MOVEPATH}/"${NEWNAME}"
    done
  done

Finden aller Dateien, die keine der aufgeführten Endungen haben.

find . -type f $(for i in ape BMP bmp CDR cue db DIZ doc DS_Store JPG jpe jpg  \
  js gif HTM htm html ico ifo ini lit LOG log log_mv m3u MP3 Mp3 mp2 mp3 mpc   \
  nfo ogg PDF pdf pls qu ra ram rar raw rip rtf sfv TXT txt url wav WMA wma    \
  wri zip; do echo "-a ! -name \"*.$i\""; done)

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
Wikipedia ger findwbm Enzyklopädischer Artikel