find
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 Bytes (c) oder KBytes (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 Bytes.
$ 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 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 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 Berechigung 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
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 über 1'000'000 bytes 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 leeren Verzeichnisse.
$ find . -type d -empty -print
Liste aller Dateien, die im Namen die Zeichenfolge "php" enthalten.
$ find . -print | grep -i php
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
Beispiele
Das Skript "videomove"
- durchsucht vom aktuellen Verzeichnis aus alle Unterverzeichnisse nach Dateien mit der Endung ".avi"
- 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"
- 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 |
---|---|---|---|