[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(1)]] [[Bild(Wiki/Icons/terminal.png, 48, left)]] Das Kommandozeilenprogramm '''find''' dient der Dateisuche in ganzen Verzeichniszweigen ab definierten [#Startpunkt-e Startpunkten]. Dabei kann es die Suche auf vielfältige Weise filtern, z.B. nach Dateiname, -alter, -größe und die Suchergebnisse weiterverarbeiten und/oder formatiert ausgeben. Da unter unixoiden Systemen der Leitsatz ''"Alles ist eine Datei"'' gilt, werden auch Verzeichnisse und anderes, was Linux im Dateiverzeichnisbaum einträgt (z.B. Sockets), gefunden. Der Einfachheit halber werden deshalb in diesem Artikel meist nur Dateien genannt. Eine Alternative zu find (mit Vor- und Nachteilen) bietet der Befehl [:locate:]. = Installation = Das Programm ist im Paket * '''findutils''' von Ubuntu enthalten und ist deshalb auf jedem System vorinstalliert. = Übersichten = Bevor einige praktische Beispiele die vielfältigen Verwendungsmöglichkeiten von find zeigen, zwei kurze Übersichten ... {{{#!vorlage Tabelle <-2 rowclass="titel">Einige, wenn auch nicht alle Suchkriterien für find +++ Kriterium Beschreibung +++ `-name DATEI` sucht nach dem Namen `DATEI`. Werden [wikipedia:Wildcard_(Informatik):Platzhalter] verwendet, müssen sie maskiert werden, sonst interpretiert sie schon die Shell. Beispiele: `\*.txt` oder `"???.t*xt"` +++ `-iname DATEI` sucht nach dem Namen `DATEI`, ohne Beachtung der Groß- und Kleinschreibung. +++ `-type T` sucht nach nur einem Typ, z.B. mit `f` (=file) echte Dateien oder mit `d` (=directory) Verzeichnisse. +++ `-mtime n` sucht nach Dateien, deren Inhalt vor n bis n+1 Tagen geändert (m=modified) wurde. +++ `-mtime +n` sucht nach Dateien, deren Inhalt älter als n+1 Tage ist. +++ `-mtime -n` sucht nach Dateien, deren Inhalt jünger als n Tage ist. +++ `-ctime n` sucht nach Dateien, deren Name oder Status (Modus, Besitzer oder Gruppe) vor n bis n+1 Tagen geändert (c=changed) wurde. +++ `-atime n` sucht nach Dateien, auf die zuletzt vor n bis n+1 Tagen zugegriffen (a=accessed) wurde. (Hinweis: Die Aussagekraft der Datei-Zugriffszeit ist stark von den [:mount/#Optionen:Einhängeoptionen] `atime`, `noatime` und `relatime` abhängig.) +++ `-mmin n` sucht nach Dateien, deren Inhalt vor n-1 bis n Minuten geändert wurde. (Achtung: andere Zählweise als bei `-Xtime`) +++ `-mmin +n` sucht nach Dateien, deren Inhalt älter als n Minuten ist. (Achtung: andere Zählweise als bei `-Xtime`) +++ `-mmin -n` sucht nach Dateien, deren Inhalt jünger als n Minuten ist. (gleiche Zählweise als bei `-Xtime`) +++ `-daystart` misst für alle darauf folgenden `-Xtime`- und `-Xmin`-Kriterien ab 0:00 h des nächsten Tages, also ab Mitternacht. +++ `-newer DATEI` sucht nach Dateien, deren Inhalt nach dem von `DATEI` verändert wurde. +++ `-size n[cwbkMG]` sucht Dateien die n Zuordnungseinheiten belegen. Folgende Multiplikatoren können zusätzlich verwendet werden: `c` für Bytes, `w` für Zwei-Byte-Wörter, `b` für 512-Byte-Blöcke (Standard), `k` für KiB (Kibibyte), `M` für MiB, `G` für GiB. +++ `-user BENUTZER` sucht nur nach Dateien des Benutzers `BENUTZER`. +++ `-nouser` sucht nach Dateien, deren User-ID keinem Benutzer entspricht. +++ `-nogroup` sucht nach Dateien, deren Gruppen-ID keiner Gruppe entspricht. +++ `-maxdepth n` sucht ab dem [#Startpunkt-e Startpunkt] nur n Verzeichnisse tief. Bezeichnet dieser ein Verzeichnis – z.B. implizit das aktuelle Verzeichnis – zählen dessen Einträge schon zu Tiefe 1. +++ `-depth` sucht erst rekursiv im Inhalt der Verzeichnisse, bevor das Verzeichnis selbst untersucht wird. (Standard bei `-delete` Aktion) }}} {{{#!vorlage Tabelle <-2 rowclass="titel">Geläufige Aktionen für `find` +++ Aktion Beschreibung +++ `-fprint DATEI` gibt die gefunden Dateinamen nicht auf die Standardausgabe (Bildschirm) aus, sondern schreibt diese in die Datei `DATEI`. +++ `-exec KOMMANDO {} \;` wendet auf alle Funde den Shellbefehl `KOMMANDO` an. `{}` steht dabei als Platzhalter für die gefundenen Dateinamen. Das Zeichen `;` terminiert den von find aufzurufenden Shellbefehl. Damit es nicht unbeabsichtigt von der Shell interpretiert wird, muss es mit `\ ` oder zwei umschließenden `"` maskiert werden. +++ `-execdir KOMMANDO {} +` wendet auf die Funde den Shellbefehl `KOMMANDO` an. Im Gegensatz zu `-exec` wird das Kommando im Verzeichnis, in dem die Datei liegt, ausgeführt. Das `+` bewirkt, dass viele Funde (bzw. hier viele eines gleichen Verzeichnisses) auf einmal an `KOMMANDO` übergeben werden, was die Ausführung stark beschleunigen kann. Das `+` kann statt dem `;` (ebenso wie bei `-exec`) nur verwendet werden, wenn `{}` der letzte Parameter von `KOMMANDO` ist. +++ `-ok KOMMANDO {} \;` Wie `-exec`, allerdings wird vor jeder Aktion eine Bestätigung erfragt. `{}` steht dabei als Platzhalter für die Funde. +++ `-okdir KOMMANDO {} +` Wie eine Kombination von `-ok` und `-execdir`, d.h. es wird eine Bestätigung erfragt, und das Kommando wird im Fundordner ausgeführt. +++ `-print` erzwingt die Ausgabe der gefunden Dateinamen, auch wenn diese als Parameter für eine andere Aktion zunächst verschluckt wurden. Mit `-printf FORMAT` kann die Ausgabe auch vielfältig gestaltet werden. +++ `-delete` löscht die gefundenen Dateien und leeren Verzeichnisse. }}} = Beispiele = Es gibt eine Unzahl weiterer Beispiele, z.B. die Suche nach Eigentümer, Berechtigungen, Dateisystem u.v.m. Solche und eine komplette Übersicht – auch über die in diesem Artikel nicht beschriebenen Optionen – bieten die [:info:Infoseiten] und das [:man:Manual] zu [man_de:find:], sowie die sehr ausführliche Seite [http://www.gnu.org/software/findutils/manual/html_mono/find.html findutils auf gnu.org] {en}. == Startpunkt(e) == Dort beginnt `find` mit der Suche – im aktuellen Verzeichnis, wenn keine extra angegeben sind. Startpunkt(e) müssen __nach__ eventuellen Optionen (in diesem Artikel nicht beschrieben) und __vor__ den ebenfalls optionalen Suchkriterien und Aktionen platziert werden. In den meisten Fällen wird es sich dabei um Verzeichnisse handeln, andere Einträge sind aber auch erlaubt. Wenn nicht die ganzen gegebenenfalls dort darunter liegenden Verzeichniszweige durchsucht werden sollen, kann die Durchsuchungstiefe mit [#Sonstige-Suchkriterien zusätzlichen Suchkriterien] begrenzt werden. * {{{#!vorlage Befehl find }}} sucht im aktuellen Verzeichnis, findet also auch '''.''' . * {{{#!vorlage Befehl find foo }}} sucht in '''foo''' im aktuellen Verzeichnisses. * {{{#!vorlage Befehl find ../ }}} sucht im übergeordneten Verzeichnis. * {{{#!vorlage Befehl find /tmp }}} sucht im absolut angegebenen Verzeichnis '''/tmp'''). * {{{#!vorlage Befehl find /tmp /boot }}} sucht in zwei Verzeichnissen (sowohl in '''/tmp''' als auch in '''/boot'''). * {{{#!vorlage Befehl find Film* }}} sucht im aktuellen Verzeichnis Einträge die mit `Film` beginnen, also u.a. Dateien und alles in mit `Film` beginnenden Pfaden (`*` wird hier schon von der Shell erweitert). * {{{#!vorlage Befehl find / }}} sucht überall (ab dem Wurzelverzeichnis - das kann dauern!). == Name == * {{{#!vorlage Befehl find -name hausarbeit.odt }}} sucht nach Dateien mit dem vollständigen Namen '''hausarbeit.odt'''. * {{{#!vorlage Befehl find -name "*.pdf" }}} sucht nach PDF-Dateien. `-name` (berücksichtigt die Groß-/Kleinschreibung, findet hier also keine Datei(en) mit Endung '''*.PDF'''). * {{{#!vorlage Befehl find -iname a\*.pdf }}} sucht nach '''.pdf'''- und '''.PDF'''-Dateien, die mit `a` oder `A` beginnen (ignoriert die Groß-/Kleinschreibung). * {{{#!vorlage Befehl find -name "katze.*" }}} findet '''katze.jpg''', '''katze.png''', '''katze.txt''' usw. * {{{#!vorlage Befehl find -name "katze.??g" }}} findet '''katze.jpg''', '''katze.png''' usw. (jedes Fragezeichen steht für ein einzelnes Zeichen). * {{{#!vorlage Befehl find -name "*foo*.*x*" }}} findet '''foo.x''', '''afoo.x''', '''foob.txt''' usw. == Pfad(teile) == Will man die Suche auf bestimmte Pfade einschränken, kommt man mit `-name` nicht weiter. Das Suchkriterium `-path` ist hier die Lösung, denn es erlaubt die Verwendung des Namenstrenners `/`. * {{{#!vorlage Befehl find -path "*2013/J*" }}} findet '''~/Bilder/2013/Juni''' und '''~/Musik/2013/Juli''', aber nicht '''~/Dokumente/2013-Juni'''. * Pfade ausschließen {{{#!vorlage Befehl find ~ -path ~/Dokumente -prune -or -path ~/Downloads -prune -or -iname "*.pdf" -print }}} findet alle PDF-Dateien im Homeverzeichnis außer die in '''~/Dokumente/''' und '''~/Downloads/'''. Das explizite `-print` ist nötig, da `-prune` nicht nur die Suche im jeweiligen Pfad sondern auch die Ausgabe zunächst abbricht. == Typ == * {{{#!vorlage Befehl find -type f }}} findet nur reguläre Dateien. Verzeichnisse, Sockets, etc. werden ausgelassen. * {{{#!vorlage Befehl find -type d }}} findet nur Verzeichnisse (Typ: directory). == Größe == * Maximale Größe {{{#!vorlage Befehl find -size -100c -ls }}} sucht nach Dateien, die kleiner als 100 Bytes sind, wofür das `-` vor der Zahl `100` steht. Das `c` dahinter bedeutet `character`, welche früher 1 Byte belegten (`b` ist schon für die Maßeinheit Block (= 512 Bytes) vergeben). Mittels dem zusätzlichen `-ls` läßt sich die Größe der gefundenen Dateien überprüfen. Deswegen wird es hier, vor den anderen [#Aktionen Aktionen], erwähnt. * Exakte Größe {{{#!vorlage Befehl find -size 100c }}} sucht nach Dateien, die genau 100 Bytes groß sind (kein Vorzeichen). * Mindestgröße {{{#!vorlage Befehl find -size +100M }}} sucht nach Dateien, die größer als 100 Mebibytes sind (Vorzeichen `+`). Statt `M` kann man auch `k` für Kibibytes oder `G` für Gibibytes angeben. * Große Einheiten {{{#!vorlage Befehl find -size 4k }}} sucht nach Dateien, die zwischen 3073 und 4096 Bytes groß sind. Analog gilt das auch für M und G. Deshalb auch [#Seltsames-Nichtfinden-bei-Groessen-wie-k-M-G Vorsicht bei der Verwendung von `-`]! * Zwischen Mindest- und Maximalgröße {{{#!vorlage Befehl find -type f -size +64c -size -4096c | wc -l }}} sucht nach Dateien, die zwischen 65 und 4095 Bytes groß sind, und wird per Pipe an [:wc:] übergeben, um die Anzahl der gefundenen Dateien zu bestimmen. * Blockbelegung {{{#!vorlage Befehl find -size 2 }}} sucht nach Dateien, die 2 Blöcke belegen, also von 513 bis 1024 Bytes Größe. Ohne Multiplikatoren-Angabe wird die Zahl als Anzahl belegter Blöcke à 512 Bytes interpretiert; die Angabe von `b` ist also optional. Wenn es Probleme mit der Suche nach Größe gibt, dann wahrscheinlich, weil man `c`, `k`, `M` oder `G` vergessen hast. == Alter == Auch hier gibt es, ähnlich wie bei der [#Groesse Größe], Mindestalter (`+`), Höchstalter (`-`), genaues Alter und Zeitbereiche. * Änderungszeit in Tagen {{{#!vorlage Befehl find -mtime -100 }}} sucht nach Dateien, deren Inhalt innerhalb der letzten 100 Tage geändert wurde (`mtime` = modification time). {{{#!vorlage Befehl find -mtime +100 }}} sucht nach Dateien, deren Inhalt vor mehr als 101 Tage geändert wurde. Dateien, die zwischen 100 und 101 Tage alt sind, werden also von keinem der beiden vorangehenden Beispiele gefunden! Weitere Optionen sind * `-ctime` (change time): Zeitpunkt, an dem der Name oder Status (Besitzer, Gruppe, Rechte) der Datei geändert wurde, oder * `-atime` (access time): Zeitpunkt, an dem auf die Datei zuletzt zugegriffen wurde. Eine Dateiauflistung selbst ist damit nicht gemeint. Bei Bilddateien z.B. zählt aber die Vorschaufunktion eines grafischen Dateimanagers oder das Auslesen der Bildeigenschaften bereits als Zugriff. Die Zugriffszeit wird erst bei mehr als 24 h Abweichung oder wenn sie älter als die letzte Änderung der Datei ist, also nicht bei jedem Lesen, aktualisiert (wenn das Dateisystem nicht mit vom Standard abweichenden zusätzlichen Optionen eingehangen ist). * Zugriffszeit in Minuten {{{#!vorlage Befehl find -amin -5 }}} sucht nach Dateien, auf die in den letzten 5 Minuten zugegriffen wurde. Analog: `-cmin`, `-mmin`. Bei `+5` werden hier alle Dateien gefunden, auf die vor mehr als 5 Minuten zugegriffen wurde, es entsteht also keine Lücke wie bei `-Xtime`. * Justierung auf Mitternacht {{{#!vorlage Befehl find -daystart -mtime 0 }}} sucht nach Dateien, deren Inhalt heute geändert wurde. * Im Vergleich zu einer bestimmten Datei {{{#!vorlage Befehl find -cnewer /tmp/referenz }}} sucht nach Dateien, deren Name oder Status nach der __Änderungszeit__ der Referenzdatei geändert wurden. Mit `touch --date='2004-02-29 15:00' /tmp/referenz` erstellt man sich eine Referenzdatei, wenn man keine hat. == Sonstige Suchkriterien == * Alle Dateien des Benutzers Klaus {{{#!vorlage Befehl find / -user klaus }}} * Leere Verzeichnisse und Dateien der Größe 0 {{{#!vorlage Befehl find -empty }}} * Verzeichnistiefe {{{#!vorlage Befehl find -maxdepth 3 }}} steigt bei der Suche nur `3` Verzeichnisebenen herab. {{{#!vorlage Befehl find -mindepth 1 }}} durchsucht die [#Startpunkt-e Startverszeichnisse], liefert sie aber nicht als Treffer – hier '''`.`''' == Kombinationen == * Standard: Und-Kombination; die Funde müssen alle Kriterien erfüllen {{{#!vorlage Befehl find -mindepth 3 -maxdepth 5 }}} sucht von Verzeichnistiefe 3 bis 5. * Weiteres Beispiel der Und-Kombination {{{#!vorlage Befehl find -mindepth 3 -type f -name "*.avi" -size +5M }}} beginnt die Suche in Verzeichnistiefe 3 und findet nur reguläre Dateien, die die Endung `.avi` haben und größer als 5 MiB sind. Man kann die Suchoptionen aber auch per oder bzw. nicht verknüpfen: * Negation {{{#!vorlage Befehl find ! -name "*.avi" -not -name "*.mp*g" }}} sucht Dateien die weder die Dateiendung `avi` noch `mpg` oder `mpeg` haben. Das Ausrufezeichen und `-not` sind gleichbedeutend. * Oder-Kombination {{{#!vorlage Befehl find -name "susi.*" -or -name "susanne.*" }}} sucht Dateien die mit `susi.` ober `susanne.` beginnen. Bei umfangreichen Kombinationen kann eine Klammerung erforderlich sein, um das gewünschte Resultat zu erhalten: * ohne Klammern {{{#!vorlage Befehl find -name "susi.*" -or -name "susanne.*" -name "*.txt" }}} Ohne Klammern wird erst die UND-Verbindung gebildet, also `susanne.*` und `*.txt`, danach erst ODER mit `susi.*`. Auch '''susi.png''' würde also gefunden. * mit Klammern {{{#!vorlage Befehl find \( -name "susi.*" -or -name "susanne.*" \) -name "*.txt" }}} Hier wird jetzt für alle Dateien gefordert, dass diese auf `.txt` enden. Klammern müssen maskiert und mit Leerzeichen isoliert werden. == Aktionen == * Ohne weitere Angaben gibt find nur die Namen der gefundenen Dateien mit Pfad aus. {{{#!vorlage Befehl find /boot/grub/ -name "he*" }}}{{{ /boot/grub/hexdump.mod /boot/grub/hello.mod /boot/grub/help.mod }}} * Wie bereits weiter oben erwähnt kann man mit `-ls` eine detailliertere Ausgabe erzeugen. {{{#!vorlage Befehl find /boot/grub/ -name "he*" -ls }}}{{{ 168624 4 -rw-r--r-- 1 root root 3196 Jan 13 17:08 /boot/grub/hexdump.mod 168603 4 -rw-r--r-- 1 root root 1308 Jan 13 17:08 /boot/grub/hello.mod 168623 4 -rw-r--r-- 1 root root 2200 Jan 13 17:08 /boot/grub/help.mod }}} * Eine etwas kritische Angelegenheit ist das Löschen mit der Aktion `-delete`. {{{#!vorlage Warnung Da find auch Unterverzeichnisse durchsucht, sollte mit dieser Aktion vorsichtig umgegangen werden. Mit find gelöschte Dateien landen nicht im Papierkorb und können nicht wieder hergestellt werden. Es ist auch sorgfältig darauf zu achten, dass nicht [#Die-Aktion-delete-steht-an-der-falschen-Stelle `-delete` an der falschen Stelle] steht. }}} Der Verwendung sollte ein Test ohne `-delete` voraus gehen, um sicher zu gehen, nicht zu viele Dateien zu löschen. Die `-delete`-Aktion impliziert `-depth`, d.h. man muss zum Testen `-depth` selbst setzen. Um keine Überraschung zu erleben also erst mal z.B.: {{{#!vorlage Befehl find STARTVERZEICHNIS -depth -name "c*" }}} und dann erst: {{{#!vorlage Befehl find STARTVERZEICHNIS -name "c*" -delete }}} Löscht im Zweig `STARTVERZEICHNIS` alle Dateien, die mit `c` beginnen. Der Befehl löscht auch Verzeichnisse selbst, die mit `c` beginnen, sofern sie leer sind, wie bei rmdir. Das ist der Grund, weshalb `-delete` ein `-depth` impliziert: Wenn erst in den Verzeichnissen gelöscht wird kann ein dadurch leeres auch selbst gelöscht werden, umgekehrt nicht. === `-exec` und dessen Varianten === * Die Anzahl der Zeilen in Textdateien findet man mit `wc -l DATEI`; kombiniert mit find sieht das so aus: {{{#!vorlage Befehl find -name "*.py" -exec wc -l {} \; }}}{{{ 10 ./abc.py 6 ./x/date-form.py 102 ./x/download.py }}} Das Kommando `wc -l` (Zeilen zählen) wird auf jede gefundene Datei angewendet. Die geschweiften Klammern werden durch die von `find` gefundenen Namen ersetzt. Am Ende muss der ganze Befehl mit einem Semikolon abgeschlossen werden. Damit das Semikolon nicht von der Shell interpretiert wird, muss man es mit einem Backslash oder Anführungsstrichen maskieren. * Als Parameter für `-exec` verschluckte Ausgabe von find wieder sichtbar machen {{{#!vorlage Befehl find tmp -name "a" -exec touch {} \; -print }}}{{{ ./tmp/a ./tmp/a/a ./tmp/a/a/a }}} Weil [:touch:] nichts ausgibt und man dann deshalb keine Kontrolle darüber hat, was getan wurde, erhält man diese so über die `-print`-Ausgabe von find. * Oft empfiehlt sich `-execdir` statt `-exec` {{{#!vorlage Befehl find startpunkt -type d -execdir tar -cjf archiv.tar.bz2 {} \; }}} `-execdir` führt das Kommando aus dem Verzeichnis heraus aus, in dem die Datei gefunden wird. So wird also für jedes Verzeichnis ein '''archiv.tar.bz2''' vor Ort angelegt. Mit einem einfachen `-exec` würde für jedes Verzeichnis ein Archiv im aktuellen Verzeichnis angelegt, d.h. das Archiv immer wieder überschrieben, so dass am Ende nur ein Archiv mit den Ergebnissen der letzten Ausführung von tar verbliebe. * Anstatt `-exec` bzw. `-execdir` kann man auch `-ok` bzw. `-okdir` verwenden {{{#!vorlage Befehl find -name "*pdf" -okdir xpdf {} \; }}} fragt vor jeder Datei nach, ob man wirklich die Aktion ausführen möchte. * Gesammelte Ausführung mit `+`\\ Beendet man ein Kommando mit Plus `+` statt mit Semikolon `;`, so werden mehrere, u.U. alle Funde auf einen Rutsch an das Kommando übergeben. Dies ist nur möglich, wenn das Kommando selbst mit mehreren Parametern zurechtkommt und das `+` unmittelbar den geschweiften Klammern folgt. Ein Beispiel mit [:du:] ergibt zunächst: {{{#!vorlage Befehl find -name "*pdf" -exec du --total {} ";" }}}{{{ 16 ./A.pdf 16 insgesamt 12 ./B.pdf 12 insgesamt 100 ./C.pdf 100 insgesamt }}} Dagegen erhält man ein sinnvolleres Ergebnis mit `+`: {{{#!vorlage Befehl find -name "*pdf" -exec du --total {} + }}}{{{ 16 ./A.pdf 12 ./B.pdf 100 ./C.pdf 128 insgesamt }}} = Weitere Informationen = == Alternativen == find ist fast immer das Mittel der Wahl, wenn es darum geht, auch Unterverzeichnisse zu durchsuchen. Wenn man den Dateinamen genau kennt, kann [:locate:] eine bessere Wahl sein. locate arbeitet allerdings mit einem Index, der 1x täglich aktualisiert wird, und findet daher ganz frische Dateien nicht. Für die spezielle Suche nach Programmen wird man whereis benutzen. Im aktuellen Verzeichnis, ohne Unterverzeichnisse zu berücksichtigen, kommt man mit [:Terminal#Vervollstaendigen-lassen-nicht-tippen:automatischer Vervollständigung] und den Jokerzeichen `*` und `?` oft weiter, wenn man Namensbestandteile kennt. Manche Programme bieten auch von sich aus an, Unterverzeichnisse zu berücksichtigen, siehe [:ls:] und [:Shell/grep:]. == Typische Fehler == === die Ausführung von find läuft (zu) lange === Wenn die Suche mit find läuft, viel zu viele Ergebnisse ausgibt und nicht aufhören will, bricht man find mit [[Vorlage(Tasten,Strg+c)]] ab. === Der Pfad muss vor dem Suchkriterium stehen === Wenn man den Stern `*` nicht maskiert, kommt es oft zu anschließender Meldung: {{{#!vorlage Befehl find /home/ich -name .* }}} {{{ find: Der Pfad muß vor dem Ausdruck stehen: .. Aufruf: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [Pfad...] [Ausdruck] }}} Korrekt ist: {{{#!vorlage Befehl find /home/ich -name ".*" }}} === Seltsame Größenangaben bei Dateien === Bei der Suche nach Dateigrößen kann man leicht verzweifeln, wenn man nicht dahinter kommt, dass die Vorgabemaßeinheit Blöcke à 512 Bytes sind. {{{#!vorlage Befehl find -size 200c }}} sucht nach Größen, die man erwartet. === Seltsames Nichtfinden bei Größen wie k, M, G === Sucht man z.B. nach Dateien, die kleiner als 5 kiB sind, so klingt folgender Befehl zunächst plausibel: {{{#!vorlage befehl find -size -5k }}} Damit werden aber nur Dateien bis maximal 4 kiB gefunden, d.h. es wird keine Datei gefunden, die 4097 Bytes groß ist, denn es wird erst aufgerundet (auf 5k) und dann verglichen. Wenn man Dateien bis 1 Mebibyte suchen wollte führt deshalb `-1M` nicht zum Ziel – selbst 1 Byte ist größer als die nächstkleinere Ganzzahl in dieser Maßeinheit, also größer als `0M`. === Kombination von -or und -and ergibt Unerwartetes === Bei der Oder- und Und-Verknüpfung von Optionen helfen Klammern, Fehler zu vermeiden. === Warnung bei falscher Position von globalen Ausdrucksoptionen === Im [:man:Manual] zu [man_de:find:] wird alles nach den Startpunkten als `AUSDRUCK` benannt. Dieser kann globale und positionale Optionen (nicht zu verwechseln mit den hier nicht beschriebenen [#Der-Pfad-muss-vor-dem-Suchkriterium-stehen Befehlsoptionen]), Tests, Operatoren und Aktionen beinhalten. Stehen globale Optionen, die immer für die ganze Suche gelten, nicht am Anfang des Ausdrucks, so sieht das aus, als habe der Nutzer eine andere Absicht gehabt, und man bekommt deshalb eine Warnung. Provozieren kann man die Warnung etwa so: {{{#!vorlage Befehl find ./SUCHVERZEICHNIS -maxdepth 4 -name foo -or -maxdepth 2 }}} {{{ find: Warnung: Sie haben die Option -maxdepth nach einem Argument -name angegeben, das keine Option ist, weil Optionen nicht positional sind (-maxdepth beeinflusst sowohl Tests davor als auch jene danach). Bitte geben Sie Optionen vor anderen Argumenten an. }}} === xargs und Schleifen === Oft findet man Konstruktionen mit `find ... xargs` oder Shellschleifen die find bemühen. Fast immer lässt sich das Problem durch eine der [#exec-und-dessen-Varianten Aktionen] (`-okdir`, `-execdir`, ...) eleganter lösen. === Die Aktion -delete steht an der falschen Stelle === Der folgende Aufruf löscht den kompletten Inhalt des Ordners '''/home/ottifant/''': {{{#!vorlage Befehl find /home/ottifant/ -delete -name Cache # falsch! }}} = Links = * [http://www.easylinux.de/2004/01/072-find/ Dateisuche mit find] {de} - Artikel von EasyLinux mit weiteren Beispielen, 01/2004 * [http://www.gnu.org/software/findutils/manual/html_mono/find.html findutils auf gnu.org] {en} - Sehr ausführliche Seite zum Thema Suche * [:Shell/Befehlsübersicht:] {Übersicht} # tag: Shell