- SYNOPSIS
- BESCHREIBUNG
- OPTIONEN
- AUSDRUCK
- UNÜBLICHE DATEINAMEN
- KONFORMITÄT MIT STANDARDS
- UMGEBUNGSVARIABLEN
- BEISPIELE
- Einfacher find|xargs-Ansatz
- Eine sicherere Variante von find -print0 | xargs -0
- Verarbeitung beliebiger Startpunkte
- Ausführen eines Befehls für jede Datei
- Durchlaufen Sie das Dateisystem nur einmal – für 2 verschiedene Aktionen
- Suchen von Dateien nach Alter
- Suchen von Dateien nach Berechtigungen
- Beschneiden - Auslassen von Dateien und Verzeichnissen
- Andere nützliche Beispiele
- RÜCKGABEWERTE
- HISTORIE
- KOMPATIBILITÄT
- KEINE FEHLER
- FEHLER
- FEHLER MELDEN
- URHEBERRECHT
- SIEHE AUCH
find – Suche nach Dateien in einer Verzeichnisstruktur
SYNOPSIS
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [Startpunkt...] [Ausdruck]
BESCHREIBUNG
Diese Manpage dokumentiert die GNU-Version von find. GNU find durchsucht den Verzeichnisbaum, der an jedem angegebenen Startpunkt beginnt, indem es den angegebenen Ausdruck von links nach rechts gemäß den Regeln der Präzedenz (siehe Abschnitt OPERATOREN) auswertet, bis das Ergebnis bekannt ist (die linke Seite ist falsch für AND-Operationen, wahr für OR-Operationen), woraufhin find mit der nächsten Dateinamen fortfährt. Wenn kein Startpunkt angegeben ist, wird . angenommen.
Wenn Sie find in einer Umgebung verwenden, in der Sicherheit wichtig ist (z. B. wenn Sie es zum Durchsuchen von Verzeichnissen verwenden, die von anderen Benutzern beschreibbar sind), sollten Sie das Kapitel „Sicherheitsüberlegungen“ der findutils-Dokumentation lesen, die „Dateien finden“ heißt und mit findutils geliefert wird. Dieses Dokument enthält auch viel mehr Details und Diskussionen als diese Manpage, daher finden Sie es möglicherweise als eine nützlichere Informationsquelle.
OPTIONEN
Die Optionen -H, -L und -P steuern die Behandlung von symbolischen Links. Befehlszeilenargumente, die diesen folgen, werden als Namen von Dateien oder Verzeichnissen behandelt, die untersucht werden sollen, bis zum ersten Argument, das mit - beginnt, oder dem Argument ( oder !. Dieses Argument und alle nachfolgenden Argumente werden als der Ausdruck interpretiert, der beschreibt, wonach gesucht werden soll. Wenn keine Pfade angegeben werden, wird das aktuelle Verzeichnis verwendet. Wenn kein Ausdruck angegeben wird, wird der Ausdruck -print verwendet (Sie sollten jedoch wahrscheinlich stattdessen -print0 verwenden).
Diese Manpage spricht von „Optionen“ innerhalb der Ausdrucksliste. Diese Optionen steuern das Verhalten von find, werden aber unmittelbar nach dem letzten Pfadnamen angegeben. Die fünf „echten“ Optionen -H, -L, -P, -D und -O müssen vor dem ersten Pfadnamen stehen, falls überhaupt. Ein doppelter Bindestrich -- könnte theoretisch verwendet werden, um zu signalisieren, dass alle verbleibenden Argumente keine Optionen sind, aber dies funktioniert aufgrund der Art und Weise, wie find das Ende der folgenden Pfadargumente bestimmt, nicht wirklich: Es liest, bis ein Ausdrucksargument kommt (das ebenfalls mit einem - beginnt). Wenn nun ein Pfadargument mit einem - beginnen würde, würde find es stattdessen als Ausdrucksargument behandeln. Um sicherzustellen, dass alle Startpunkte als solche behandelt werden und insbesondere um zu verhindern, dass Wildcard-Muster, die von der aufrufenden Shell erweitert werden, fälschlicherweise als Ausdrucksargumente behandelt werden, ist es im Allgemeinen sicherer, Wildcards oder fragwürdige Pfadnamen entweder mit ./ zu versehen oder absolute Pfadnamen zu verwenden, die mit / beginnen. Alternativ ist es im Allgemeinen sicher, wenn auch nicht portabel, die GNU-Option -files0-from zu verwenden, um beliebige Startpunkte an find zu übergeben.
-P Symbolische Links niemals verfolgen. Dies ist das Standardverhalten. Wenn `find` Dateien untersucht oder Informationen über sie ausgibt und die Datei ein symbolischer Link ist, sollten die verwendeten Informationen den Eigenschaften des symbolischen Links selbst entnommen werden.
-L Symbolische Links verfolgen. Wenn `find` Dateien untersucht oder Informationen über sie ausgibt, sollten die verwendeten Informationen den Eigenschaften der Datei entnommen werden, auf die der Link zeigt, und nicht den Eigenschaften des Links selbst (es sei denn, es handelt sich um einen defekten symbolischen Link oder `find` kann die Datei, auf die der Link zeigt, nicht untersuchen). Die Verwendung dieser Option impliziert `-noleaf`. Wenn `-L` aktiv ist und `find` während der Suche auf einen symbolischen Link zu einem Unterverzeichnis stößt, wird das durch den symbolischen Link angegebene Unterverzeichnis durchsucht.
Wenn die Option -L aktiv ist, wird das Prädikat -type immer mit dem Typ der Datei übereinstimmen, auf die ein symbolischer Link zeigt, und nicht mit dem Link selbst (es sei denn, der symbolische Link ist defekt). Aktionen, die dazu führen können, dass symbolische Links während der Ausführung von find defekt werden (z. B. -delete), können zu verwirrenden Ergebnissen führen. Die Verwendung von -L bewirkt, dass die Prädikate -lname und -ilname immer false zurückgeben.
-H Symbolische Links nicht verfolgen, außer bei der Verarbeitung der Befehlszeilenargumente. Wenn `find` Dateien untersucht oder Informationen über sie ausgibt, sollten die verwendeten Informationen den Eigenschaften des symbolischen Links selbst entnommen werden. Die einzige Ausnahme von diesem Verhalten ist, wenn eine in der Befehlszeile angegebene Datei ein symbolischer Link ist und der Link aufgelöst werden kann. In diesem Fall werden die Informationen den Eigenschaften der Datei entnommen, auf die der Link zeigt (d. h. der Link wird verfolgt). Die Informationen über den Link selbst werden als Ausweichlösung verwendet, falls die durch den symbolischen Link angegebene Datei nicht untersucht werden kann. Wenn `-H` aktiv ist und einer der in der Befehlszeile angegebenen Pfade ein symbolischer Link zu einem Verzeichnis ist, werden die Inhalte dieses Verzeichnisses untersucht (obwohl `-maxdepth 0` dies natürlich verhindern würde).
Wenn mehr als eine der Optionen -H, -L und -P angegeben wird, überschreibt jede die anderen; die letzte, die in der Befehlszeile erscheint, wird wirksam. Da -P die Standardeinstellung ist, sollte angenommen werden, dass sie wirksam ist, es sei denn, entweder -H oder -L wird angegeben.
GNU find führt häufig Dateistatusabfragen während der Verarbeitung der Befehlszeile durch, bevor eine Suche beginnt. Diese Optionen beeinflussen auch die Art und Weise, wie diese Argumente verarbeitet werden. Insbesondere gibt es eine Reihe von Tests, die Dateien vergleichen, die in der Befehlszeile aufgeführt sind, mit einer Datei, die wir gerade betrachten. In jedem Fall wurde die in der Befehlszeile angegebene Datei untersucht und einige ihrer Eigenschaften wurden gespeichert. Wenn die angegebene Datei tatsächlich ein symbolischer Link ist und die Option -P aktiv ist (oder wenn weder -H noch -L angegeben wurden), werden die für den Vergleich verwendeten Informationen den Eigenschaften des symbolischen Links entnommen. Andernfalls werden sie den Eigenschaften der Datei entnommen, auf die der Link zeigt. Wenn find den Link nicht verfolgen kann (z. B. weil er nicht über ausreichende Berechtigungen verfügt oder der Link auf eine nicht vorhandene Datei zeigt), werden die Eigenschaften des Links selbst verwendet.
Wenn die Optionen -H oder -L aktiv sind, werden alle symbolischen Links, die als Argument von -newer angegeben sind, aufgelöst, und der Zeitstempel wird von der Datei übernommen, auf die der symbolische Link verweist. Die gleiche Überlegung gilt für -newerXY, -anewer und -cnewer.
Die Option -follow hat eine ähnliche Wirkung wie -L, wobei sie ab dem Zeitpunkt wirkt, an dem sie erscheint (d.h. wenn -L nicht verwendet wird, aber -follow, werden alle symbolischen Links, die nach -follow auf der Befehlszeile erscheinen, aufgelöst, und diejenigen davor nicht).
-D debugopts
Gibt Diagnoseinformationen aus; dies kann hilfreich sein, um Probleme zu beheben, warum find nicht das tut, was Sie möchten. Die Liste der Debug-Optionen sollte durch Kommas getrennt sein. Die Kompatibilität der Debug-Optionen ist nicht zwischen den Versionen von findutils garantiert. Für eine vollständige Liste der gültigen Debug-Optionen siehe die Ausgabe von find -D help. Gültige Debug-Optionen sind:
exec Zeigt Diagnoseinformationen in Bezug auf -exec, -execdir, -ok und -okdir an.
opt Gibt Diagnoseinformationen in Bezug auf die Optimierung des Ausdrucksbaums aus; siehe die Option -O.
rates Gibt eine Zusammenfassung aus, die angibt, wie oft jede Prädikat erfolgreich oder fehlgeschlagen ist.
search Durchläuft den Verzeichnisbaum ausführlich.
stat Gibt Meldungen aus, während Dateien mit den Systemaufrufen stat und lstat untersucht werden. Das find-Programm versucht, diese Aufrufe zu minimieren.
tree Zeigt den Ausdrucksbaum in seiner ursprünglichen und optimierten Form an.
all Aktiviert alle anderen Debug-Optionen (aber nicht help).
help Erläutert die Debug-Optionen.
-Olevel
Aktiviert die Abfrageoptimierung. Das find-Programm ordnet Tests neu an, um die Ausführung zu beschleunigen, während die allgemeine Wirkung erhalten bleibt; das heißt, Prädikate mit Nebeneffekten werden nicht relativ zueinander neu angeordnet. Die bei jedem Optimierungslevel durchgeführten Optimierungen sind wie folgt:
0 Entspricht dem Optimierungslevel 1.
1 Dies ist das Standard-Optimierungslevel und entspricht dem traditionellen Verhalten. Ausdrücke werden so neu angeordnet, dass zuerst Tests durchgeführt werden, die nur auf den Dateinamen basieren (z. B. -name und -regex).
2 Alle -type- oder -xtype-Tests werden nach allen Tests durchgeführt, die nur auf den Dateinamen basieren, aber vor allen Tests, die Informationen aus dem Inode benötigen. Auf vielen modernen Unix-Versionen werden Dateitypen von readdir() zurückgegeben, sodass diese Prädikate schneller ausgewertet werden können als Prädikate, die zuerst die Datei statten müssen. Wenn Sie das Prädikat -fstype FOO verwenden und einen Dateisystemtyp FOO angeben, der zum Zeitpunkt des Starts von find nicht bekannt ist (d. h. in /etc/mtab vorhanden ist), entspricht dieses Prädikat -false.
3 Bei diesem Optimierungsgrad ist der vollständige, kostenbasierte Abfrageoptimierer aktiviert.
Die Reihenfolge der Tests wird so geändert, dass zuerst kostengünstige (d. h. schnelle) Tests und bei Bedarf später teurere Tests durchgeführt werden. Innerhalb jeder Kostenbande werden Prädikate früher oder später ausgewertet, je nachdem, ob sie wahrscheinlich erfolgreich sein werden oder nicht. Für -o werden Prädikate, von denen angenommen wird, dass sie wahrscheinlich erfolgreich sind, früher ausgewertet, und für -a werden Prädikate, von denen angenommen wird, dass sie wahrscheinlich fehlschlagen, früher ausgewertet.
Der kostenbasierte Optimierer hat eine feste Vorstellung davon, wie wahrscheinlich ein bestimmter Test erfolgreich ist. In einigen Fällen berücksichtigt die Wahrscheinlichkeit die spezifische Art des Tests (z. B. wird angenommen, dass -type f eher erfolgreich ist als -type c). Der kostenbasierte Optimierer wird derzeit evaluiert. Wenn er die Leistung von find nicht tatsächlich verbessert, wird er wieder entfernt. Umgekehrt können Optimierungen, die sich als zuverlässig, robust und effektiv erweisen, im Laufe der Zeit bei niedrigeren Optimierungsgraden aktiviert werden. Das Standardverhalten (d. h. Optimierungsgrad 1) wird jedoch in der 4.3.x-Reihe nicht geändert. Die findutils-Testsuite führt alle Tests bei find bei jedem Optimierungsgrad aus und stellt sicher, dass das Ergebnis gleich ist.
Die durch den kostenbasierten Optimierer vorgenommene Reihenfolge der Operationen kann zu einer für den Benutzer wahrnehmbaren Verhaltensänderung führen. Beispielsweise sind die Prädikate -readable und -empty empfindlich gegenüber einer veränderten Reihenfolge. Wenn sie in der Reihenfolge -empty -readable ausgeführt werden, wird eine Fehlermeldung für nicht lesbare Verzeichnisse ausgegeben. Wenn sie in der Reihenfolge -readable -empty ausgeführt werden, wird keine Fehlermeldung ausgegeben. Dies ist der Grund, warum eine solche Änderung der Reihenfolge der Operationen nicht bei dem Standardoptimierungsgrad durchgeführt wird.
AUSDRUCK
Der Teil der Befehlszeile nach der Liste der Startpunkte ist der Ausdruck. Dies ist eine Art von Abfragespezifikation, die beschreibt, wie wir Dateien finden und was wir mit den gefundenen Dateien tun. Ein Ausdruck besteht aus einer Folge von Elementen:
Tests
Tests geben einen Wahrheitswert zurück, in der Regel auf der Grundlage einer bestimmten Eigenschaft der Datei, die wir betrachten. Der Test -empty ist beispielsweise nur dann wahr, wenn die aktuelle Datei leer ist.
Aktionen
Aktionen haben Nebenwirkungen (z. B. das Ausgeben von etwas auf die Standardausgabe) und geben entweder true oder false zurück, in der Regel je nachdem, ob sie erfolgreich waren oder nicht. Die Aktion -print gibt beispielsweise den Namen der aktuellen Datei auf die Standardausgabe aus.
Globale Optionen
Globale Optionen wirken sich auf die Ausführung von Tests und Aktionen aus, die in einem beliebigen Teil der Befehlszeile angegeben sind. Globale Optionen geben immer true zurück. Die Option -depth bewirkt beispielsweise, dass find das Dateisystem in einer Tiefensuche durchläuft.
Positionale Optionen
Positionale Optionen wirken sich nur auf Tests oder Aktionen aus, die darauf folgen. Positionale Optionen geben immer true zurück. Die Option -regextype ist beispielsweise eine positionale Option, die den Dialekt der regulären Ausdrücke für reguläre Ausdrücke angibt, die später in der Befehlszeile vorkommen.
Operatoren
Operatoren verbinden die einzelnen Elemente innerhalb des Ausdrucks miteinander. Sie umfassen zum Beispiel -o (was eine logische ODER-Verknüpfung bedeutet) und -a (was eine logische UND-Verknüpfung bedeutet). Wenn ein Operator fehlt, wird -a angenommen.
Die Aktion -print wird für alle Dateien ausgeführt, für die der gesamte Ausdruck wahr ist, es sei denn, er enthält eine andere Aktion als -prune oder -quit. Aktionen, die die Standardaktion -print unterdrücken, sind -delete, -exec, -execdir, -ok, -okdir, -fls, -fprint, -fprintf, -ls, -print und -printf.
Die Aktion -delete wirkt sich auch wie eine Option aus (da sie -depth impliziert).
POSITIONALE OPTIONEN
Positionale Optionen geben immer true zurück. Sie wirken sich nur auf Tests aus, die später in der Befehlszeile auftreten.
-daystart
Misst Zeiträume (für -amin, -atime, -cmin, -ctime, -mmin und -mtime) vom Beginn des
heutigen Tages und nicht vom Zeitpunkt vor 24 Stunden. Diese Option wirkt sich nur auf Tests aus, die später in der
Befehlszeile auftreten.
-follow
Veraltet; verwenden Sie stattdessen die Option -L. Dereferenziert symbolische Links. Impliziert -noleaf. Die Option -follow wirkt sich nur auf die Tests aus, die danach in der Befehlszeile erscheinen. Es sei denn, die Option -H oder -L wurde angegeben, ändert die Position der Option -follow das Verhalten des Prädikats -newer; alle Dateien, die als Argument von -newer aufgeführt sind, werden dereferenziert, wenn es sich um symbolische Links handelt. Die gleiche Überlegung gilt für -newerXY, -anewer und -cnewer. Ebenso wird das Prädikat -type immer mit dem Typ der Datei übereinstimmen, auf die ein symbolischer Link verweist, und nicht mit dem Link selbst. Die Verwendung von -follow führt dazu, dass die Prädikate -lname und -ilname immer false zurückgeben.
-regextype type
Ändert die Syntax für reguläre Ausdrücke, die von den Tests -regex und -iregex verwendet werden, die später in der Befehlszeile auftreten. Um zu sehen, welche Typen von regulären Ausdrücken bekannt sind, verwenden Sie -regextype help. Die Texinfo-Dokumentation (siehe SIEHE AUCH) erklärt die Bedeutung und die Unterschiede zwischen den verschiedenen Typen von regulären Ausdrücken. Wenn Sie diese Option nicht verwenden, verhält sich find so, als ob der Typ emacs für reguläre Ausdrücke angegeben worden wäre.
-warn, -nowarn
Schaltet Warnmeldungen ein oder aus. Diese Warnungen gelten nur für die Verwendung in der Befehlszeile und nicht für Bedingungen, auf die find beim Durchsuchen von Verzeichnissen stößt. Das Standardverhalten entspricht -warn, wenn die Standardeingabe ein TTY ist, und -nowarn in den anderen Fällen. Wenn eine Warnmeldung bezüglich der Verwendung in der Befehlszeile ausgegeben wird, wird der Exit-Status von find nicht beeinflusst. Wenn die Umgebungsvariable POSIXLY_CORRECT gesetzt ist und -warn ebenfalls verwendet wird, wird nicht angegeben, welche Warnungen, falls überhaupt, aktiv sind.
GLOBALE OPTIONEN
Globale Optionen geben immer true zurück. Globale Optionen wirken sich auch auf Tests aus, die früher in der Befehlszeile auftreten. Um Verwirrung zu vermeiden, sollten globale Optionen in der Befehlszeile nach der Liste der Startpunkte, unmittelbar vor dem ersten Test, der ersten positionalen Option oder Aktion angegeben werden. Wenn Sie eine globale Option an einer anderen Stelle angeben, gibt find eine Warnmeldung aus, die darauf hinweist, dass dies verwirrend sein kann.
Die globalen Optionen werden nach der Liste der Startpunkte angegeben und sind daher nicht die gleiche Art von Option wie beispielsweise -L.
`-d` Ein Synonym für `-depth`, zur Kompatibilität mit FreeBSD, NetBSD, MacOS X und OpenBSD.
`-depth` Verarbeiten Sie den Inhalt jedes Verzeichnisses, bevor das Verzeichnis selbst verarbeitet wird. Die Aktion `-delete` impliziert ebenfalls `-depth`.
`-files0-from datei` Lesen Sie die Startpunkte aus einer Datei, anstatt sie über die Befehlszeile zu erhalten. Im Gegensatz zu den bekannten Einschränkungen beim Übergeben von Startpunkten über Argumente auf der Befehlszeile, nämlich der Begrenzung der Anzahl der Dateinamen und der inhärenten Mehrdeutigkeit, wenn Dateinamen mit Optionsnamen übereinstimmen, ermöglicht diese Option, eine beliebige Anzahl von Startpunkten an `find` zu übergeben.
Die Verwendung dieser Option und die Übergabe von Startpunkten über die Befehlszeile schließen sich gegenseitig aus und sind daher nicht gleichzeitig zulässig.
Das Dateiarqument ist obligatorisch. Sie können -files0-from - verwenden, um die Liste der Startpunkte aus dem Standardeingabestrom zu lesen, z. B. aus einer Pipe. In diesem Fall sind die Aktionen -ok und -okdir nicht zulässig, da sie offensichtlich das Lesen aus dem Standardeingang zur Einholung einer Benutzerbestätigung beeinträchtigen würden.
Die Startpunkte in der Datei müssen durch ASCII-NULL-Zeichen getrennt sein. Zwei aufeinanderfolgende NULL-Zeichen, d. h. ein Startpunkt mit einem Dateinamen der Länge Null, sind nicht zulässig und führen zu einer Fehlermeldung, gefolgt von einem Fehlercode ungleich Null.
Wenn die angegebene Datei leer ist, verarbeitet find keinen Startpunkt und beendet sich daher unmittelbar nach dem Parsen der Programmargumente. Dies unterscheidet sich von der Standardaufrufweise, bei der find das aktuelle Verzeichnis als Startpunkt annimmt, wenn kein Pfadargument übergeben wird.
Die Verarbeitung der Startpunkte erfolgt ansonsten wie gewohnt, z. B. durchläuft find Unterverzeichnisse, es sei denn, dies wird anderweitig verhindert. Um nur die Startpunkte zu verarbeiten, kann man zusätzlich -maxdepth 0 übergeben.
Weitere Hinweise: Wenn eine Datei mehr als einmal in der Eingabedatei aufgeführt ist, ist es nicht festgelegt, ob sie mehr als einmal besucht wird. Wenn die Datei während der Ausführung von find geändert wird, ist das Ergebnis ebenfalls nicht festgelegt. Schließlich ist auch die Dateiposition innerhalb der genannten Datei zum Zeitpunkt, zu dem find beendet wird, sei es mit -quit oder auf andere Weise, nicht festgelegt. Mit „nicht festgelegt“ ist gemeint, dass es möglicherweise funktioniert oder etwas Bestimmtes tut, und dass sich das Verhalten von Plattform zu Plattform oder von findutils-Version zu Version ändern kann.
`-help`, `--help`
Gibt eine Zusammenfassung der Befehlszeilenoptionen von find aus und beendet das Programm.
`-ignore_readdir_race`
Normalerweise gibt find eine Fehlermeldung aus, wenn das Programm das Stat-Ausführen einer Datei nicht durchführen kann. Wenn Sie diese Option angeben und eine Datei zwischen dem Zeitpunkt, zu dem find den Dateinamen aus dem Verzeichnis liest, und dem Zeitpunkt, zu dem es versucht, die Datei zu stat-en, gelöscht wird, wird keine Fehlermeldung ausgegeben. Dies gilt auch für Dateien oder Verzeichnisse, deren Namen auf der Befehlszeile angegeben sind. Diese Option wird zum Zeitpunkt des Lesens der Befehlszeile wirksam, was bedeutet, dass Sie nicht einen Teil des Dateisystems mit dieser Option aktiviert und einen anderen Teil mit dieser Option deaktiviert durchsuchen können (wenn Sie dies tun müssen, müssen Sie stattdessen zwei find-Befehle ausgeben, einen mit der Option und einen ohne).
Darüber hinaus wird die Option -ignore_readdir_race die Fehler der Aktion -delete ignorieren, falls die Datei seit dem Einlesen des übergeordneten Verzeichnisses verschwunden ist: Es wird keine Fehlermeldung ausgegeben, und der Rückgabewert der Aktion -delete ist true.
`-maxdepth levels`
Durchsucht höchstens `levels` (eine nicht-negative ganze Zahl) Verzeichnisebenen unterhalb der Startpunkte. Die Verwendung von `-maxdepth 0` bedeutet, dass die Tests und Aktionen nur auf die Startpunkte selbst angewendet werden.
`-mindepth levels`
Wendet keine Tests oder Aktionen auf Ebenen unterhalb von `levels` (eine nicht-negative ganze Zahl) an. Die Verwendung von `-mindepth 1` bedeutet, dass alle Dateien außer den Startpunkten verarbeitet werden.
`-mount`
Durchsucht keine Verzeichnisse auf anderen Dateisystemen. Ein alternativer Name für `-xdev`, zur Kompatibilität mit einigen anderen Versionen von `find`.
`-noignore_readdir_race`
Deaktiviert die Wirkung von `-ignore_readdir_race`.
`-noleaf`
Optimiert nicht, indem davon ausgegangen wird, dass Verzeichnisse 2 weniger Unterverzeichnisse als ihre Anzahl an Hardlinks enthalten. Diese Option ist erforderlich, wenn Dateisysteme durchsucht werden, die der Unix-Verzeichnis-Link-Konvention nicht folgen, wie z. B. CD-ROM- oder MS-DOS-Dateisysteme oder AFS-Volume-Mounts. Jedes Verzeichnis auf einem normalen Unix-Dateisystem hat mindestens 2 Hardlinks: seinen Namen und seinen `.`-Eintrag. Darüber hinaus hat jedes seiner Unterverzeichnisse (falls vorhanden) einen `..`-Eintrag, der auf dieses Verzeichnis verweist. Wenn `find` ein Verzeichnis untersucht, nachdem es 2 weniger Unterverzeichnisse als die Anzahl der Links des Verzeichnisses stattet, weiß es, dass die restlichen Einträge im Verzeichnis keine Verzeichnisse sind (`Leaf`-Dateien im Dateibaum). Wenn nur die Dateinamen untersucht werden müssen, besteht keine Notwendigkeit, diese zu statten; dies führt zu einer deutlichen Geschwindigkeitssteigerung der Suche.
`-version`, `--version`
Gibt die Versionsnummer von `find` aus und beendet das Programm.
`-xdev`
Durchsucht keine Verzeichnisse auf anderen Dateisystemen.
TESTS
Einige Tests, wie z. B. -newerXY und -samefile, ermöglichen den Vergleich zwischen der aktuell untersuchten Datei und einer auf der Kommandozeile angegebenen Referenzdatei. Wenn diese Tests verwendet werden, wird die Interpretation der Referenzdatei durch die Optionen -H, -L und -P sowie durch alle vorherigen -follow-Optionen bestimmt, aber die Referenzdatei wird nur einmal untersucht, wenn die Kommandozeile geparst wird. Wenn die Referenzdatei nicht untersucht werden kann (z. B. wenn der stat(2)-Systemaufruf für sie fehlschlägt), wird eine Fehlermeldung ausgegeben, und find wird mit einem nicht-null-Status beendet.
Ein numerisches Argument n kann für Tests (wie -amin, -mtime, -gid, -inum, -links, -size, -uid und -used) angegeben werden als:
+n für größer als n,
-n für kleiner als n,
n für genau n.
Unterstützte Tests:
-amin n
Die Datei wurde vor weniger als, mehr als oder genau n Minuten zuletzt abgerufen.
-anewer Referenz
Die Zeit des letzten Zugriffs auf die aktuelle Datei ist neuer als die Zeit der letzten Datenänderung der Referenzdatei. Wenn Referenz ein symbolischer Link ist und die Option -H oder die Option -L aktiv ist, wird immer die Zeit der letzten Datenänderung der Datei verwendet, auf die sie zeigt.
-atime n
Die Datei wurde vor weniger als, mehr als oder genau n*24 Stunden zuletzt abgerufen. Wenn find berechnet, wie viele 24-Stunden-Perioden die Datei zuletzt abgerufen wurde, wird jeder gebrochene Teil ignoriert, so dass eine Datei, um mit -atime +1 übereinzustimmen, mindestens vor zwei Tagen abgerufen worden sein muss.
-cmin n
Der Status der Datei wurde vor weniger als, mehr als oder genau n Minuten zuletzt geändert.
-cnewer Referenz
Die Zeit der letzten Statusänderung der aktuellen Datei ist neuer als die Zeit der letzten Datenänderung der Referenzdatei. Wenn Referenz ein symbolischer Link ist und die Option -H oder die Option -L aktiv ist, wird immer die Zeit der letzten Datenänderung der Datei verwendet, auf die sie zeigt.
-ctime n
Der Status der Datei wurde vor weniger als, mehr als oder genau n*24 Stunden zuletzt geändert. Siehe die Kommentare für -atime, um zu verstehen, wie sich die Rundung auf die Interpretation der Zeitpunkte der Statusänderung der Datei auswirkt.
-empty Die Datei ist leer und entweder eine reguläre Datei oder ein Verzeichnis.
-executable
Passt zu Dateien, die ausführbar sind, und Verzeichnisse, die für den aktuellen Benutzer durchsuchbar sind (im Sinne der Dateinamenauflösung). Dies berücksichtigt Zugriffskontrolllisten und andere Berechtigungsartefakte, die der Test -perm ignoriert. Dieser Test verwendet den Systemaufruf access(2) und kann daher von NFS-Servern, die UID-Zuordnung (oder Root-Squashing) verwenden, getäuscht werden, da viele Systeme access(2) im Client-Kernel implementieren und daher nicht die auf dem Server gespeicherten UID-Zuordnungsinformationen verwenden können. Da dieser Test nur auf dem Ergebnis des Systemaufrufs access(2) basiert, gibt es keine Garantie, dass eine Datei, für die dieser Test erfolgreich ist, tatsächlich ausgeführt werden kann.
-false Immer falsch.
-fstype Typ
Die Datei befindet sich auf einem Dateisystem des Typs Typ. Die gültigen Dateisystemtypen variieren je nach Unix-Version; eine unvollständige Liste der Dateisystemtypen, die in einigen Versionen von Unix akzeptiert werden, ist: ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K. Sie können -printf mit der Direktive %F verwenden, um die Typen Ihrer Dateisysteme anzuzeigen.
-gid n Die numerische Gruppen-ID der Datei ist kleiner als, größer als oder genau n.
-group gname
Die Datei gehört zur Gruppe gname (numerische Gruppen-ID erlaubt).
-ilname Muster
Wie -lname, aber der Vergleich ist nicht zwischen Groß- und Kleinschreibung unterscheidend. Wenn die Option -L oder die Option -follow aktiv ist, gibt dieser Test false zurück, es sei denn, der symbolische Link ist defekt.
-iname muster
Wie -name, aber die Übereinstimmung ist nicht case-sensitiv. Zum Beispiel stimmen die Muster `fo*` und `F??`
mit den Dateinamen `Foo`, `FOO`, `foo`, `fOo` usw. überein. Das Muster `*foo*` stimmt auch mit
einer Datei namens `.foobar` überein.
-inum n
Datei hat eine Inode-Nummer, die kleiner als, größer als oder genau n ist. Normalerweise ist
es einfacher, den -samefile-Test zu verwenden.
-ipath muster
Wie -path, aber die Übereinstimmung ist nicht case-sensitiv.
-iregex muster
Wie -regex, aber die Übereinstimmung ist nicht case-sensitiv.
-iwholename muster
Siehe -ipath. Diese Alternative ist weniger portabel als -ipath.
-links n
Datei hat weniger als, mehr als oder genau n Hardlinks.
-lname muster
Datei ist ein symbolischer Link, dessen Inhalt mit dem Shell-Muster muster übereinstimmt. Die
Metazeichen behandeln `\` oder `.` nicht speziell. Wenn die Option -L oder die Option -follow
aktiv ist, gibt dieser Test `false` zurück, es sei denn, der symbolische Link ist defekt.
-mmin n
Die Daten der Datei wurden vor weniger als, mehr als oder genau n Minuten geändert.
-mtime n
Die Daten der Datei wurden vor weniger als, mehr als oder genau n * 24 Stunden geändert. Siehe
die Kommentare zu -atime, um zu verstehen, wie die Rundung die Interpretation der
Dateiänderungszeiten beeinflusst.
-name muster
Der Basisname der Datei (der Pfad, bei dem die führenden Verzeichnisse entfernt wurden) stimmt
mit dem Shell-Muster muster überein. Da die führenden Verzeichnisse der Dateinamen entfernt
werden, sollte das Muster keinen Schrägstrich enthalten, da `-name a/b` niemals etwas
anpassen würde (und Sie möchten stattdessen -path verwenden). Eine Ausnahme hiervon ist die
Verwendung eines einzelnen Schrägstrichs als Muster (`-name /`), da dies ein gültiger String
ist, um mit dem Stammverzeichnis "/" übereinzustimmen (da der Basisname von "/" "/" ist). Es
wird eine Warnung ausgegeben, wenn Sie versuchen, ein Muster zu übergeben, das einen, aber nicht
nur einen, Schrägstrich enthält, es sei denn, die Umgebungsvariable POSIXLY_CORRECT ist gesetzt
oder die Option -nowarn verwendet wird.
Um ein Verzeichnis und die darin enthaltenen Dateien zu ignorieren, verwenden Sie -prune, anstatt jede Datei in der Baumstruktur zu überprüfen; siehe ein Beispiel in der Beschreibung dieser Aktion. Klammern werden nicht als spezielle Zeichen erkannt, obwohl einige Shells, einschließlich Bash, Klammern eine spezielle Bedeutung in Shell-Mustern verleihen. Die Dateinamenerkennung wird mit der Bibliotheksfunktion fnmatch(3) durchgeführt. Vergessen Sie nicht, das Muster in Anführungszeichen zu setzen, um es vor der Expansion durch die Shell zu schützen.
-newer referenz
Die Zeit der letzten Datenänderung der aktuellen Datei ist neuer als die der letzten
Datenänderung der Referenzdatei. Wenn Referenz ein symbolischer Link ist und die Option -H
oder die Option -L aktiv ist, wird immer die Zeit der letzten Datenänderung der Datei, auf die
er verweist, verwendet.
-newerXY referenz
Erfolgreich, wenn der Zeitstempel X der betrachteten Datei neuer ist als der Zeitstempel Y der
Datei referenz. Die Buchstaben X und Y können beliebige der folgenden Buchstaben sein:
a Die Zugriffszeit der Dateireferenz
B Die Erstellungszeit der Dateireferenz
c Die Zeit der letzten Änderung des Inode-Status der Referenz
m Die Änderungszeit der Dateireferenz
t Die Referenz wird direkt als Zeit interpretiert
Einige Kombinationen sind ungültig; zum Beispiel ist es ungültig, wenn X t ist. Einige Kombinationen werden nicht auf allen Systemen unterstützt; zum Beispiel wird B nicht auf allen Systemen unterstützt. Wenn eine ungültige oder nicht unterstützte Kombination aus XY angegeben wird, führt dies zu einem fatalen Fehler. Zeitangaben werden wie für das Argument der Option -d von GNU date interpretiert. Wenn Sie versuchen, die Erstellungszeit einer Referenzdatei zu verwenden und die Erstellungszeit nicht ermittelt werden kann, führt dies zu einer fatalen Fehlermeldung. Wenn Sie einen Test angeben, der sich auf die Erstellungszeit der untersuchten Dateien bezieht, schlägt dieser Test für alle Dateien fehl, bei denen die Erstellungszeit unbekannt ist.
-nogroup
Keine Gruppe entspricht der numerischen Gruppen-ID der Datei.
-nouser
Kein Benutzer entspricht der numerischen Benutzer-ID der Datei.
-path muster
Der Dateiname stimmt mit dem Shell-Muster muster überein. Die Metazeichen behandeln `/\' oder `.\' nicht besonders; daher wird beispielsweise find . -path "./sr*sc" einen Eintrag für ein Verzeichnis namens ./src/misc ausgeben (falls es existiert). Um einen ganzen Verzeichnisbaum zu ignorieren, verwenden Sie -prune, anstatt jede Datei im Baum zu überprüfen. Beachten Sie, dass der Musterabgleichstest auf den gesamten Dateinamen angewendet wird, beginnend mit einem der auf der Befehlszeile angegebenen Startpunkte. Es würde nur Sinn machen, einen absoluten Pfadnamen hier zu verwenden, wenn der relevante Startpunkt ebenfalls ein absoluter Pfad ist. Das bedeutet, dass dieser Befehl niemals etwas findet: find bar -path /foo/bar/myfile -print Find vergleicht das Argument -path mit der Verkettung eines Verzeichnisnamens und des Basisnamens der Datei, die es untersucht. Da die Verkettung niemals mit einem Schrägstrich endet, stimmen -path-Argumente, die mit einem Schrägstrich enden, mit nichts überein (außer möglicherweise einem auf der Befehlszeile angegebenen Startpunkt). Das Prädikat -path wird auch von HP-UX find unterstützt und ist Teil des POSIX 2008-Standards.
-perm modus
Die Berechtigungsbits der Datei sind genau modus (oktal oder symbolisch). Da eine exakte Übereinstimmung erforderlich ist, müssen Sie möglicherweise eine recht komplexe Moduszeichenfolge angeben, wenn Sie diese Form für symbolische Modi verwenden möchten. Zum Beispiel stimmt -perm g=w nur mit Dateien überein, die den Modus 0020 haben (d. h. solche, bei denen die Gruppen-Schreibberechtigung die einzige gesetzte Berechtigung ist). Wahrscheinlicher ist es, dass Sie die Formen / oder - verwenden möchten, zum Beispiel -perm -g=w, die mit jeder Datei übereinstimmen, die die Gruppen-Schreibberechtigung hat. Sehen Sie sich den Abschnitt EXEMPLE für einige illustrative Beispiele an.
-perm -modus
Alle Berechtigungsbits modus sind für die Datei gesetzt. Symbolische Modi werden in dieser Form akzeptiert, und dies ist normalerweise die Art und Weise, wie Sie sie verwenden möchten. Sie müssen u, g oder o angeben, wenn Sie einen symbolischen Modus verwenden. Sehen Sie sich den Abschnitt EXEMPLE für einige illustrative Beispiele an.
-perm /modus
Irgendeines der Berechtigungsbits modus ist für die Datei gesetzt. Symbolische Modi werden in dieser Form akzeptiert. Sie müssen u, g oder o angeben, wenn Sie einen symbolischen Modus verwenden. Sehen Sie sich den Abschnitt EXEMPLE für einige illustrative Beispiele an. Wenn keine Berechtigungsbits in modus gesetzt sind, stimmt dieser Test mit jeder Datei überein (die Idee hier ist, mit dem Verhalten von -perm -000 übereinzustimmen).
-perm +mode
Dies wird nicht mehr unterstützt (und ist seit 2005 veraltet). Verwenden Sie stattdessen -perm /mode.
-readable
Passt zu Dateien, die für den aktuellen Benutzer lesbar sind. Dies berücksichtigt Zugriffskontrolllisten und andere Berechtigungsartefakte, die der -perm-Test ignoriert. Dieser Test verwendet den Systemaufruf access(2) und kann daher von NFS-Servern, die UID-Mapping verwenden, getäuscht werden. (oder Root-Squashing), da viele Systeme access(2) im Kernel des Clients implementieren und daher nicht auf die UID-Mapping-Informationen auf dem Server zugreifen können.
-regex pattern
Der Dateiname entspricht dem regulären Ausdrucksmuster. Dies ist eine Übereinstimmung mit dem gesamten Pfad, nicht mit einer
Suche. Um beispielsweise eine Datei mit dem Namen ./fubar3 abzugleichen, können Sie den regulären Ausdruck
.*bar.' oder.b.3' verwenden, aber nicht `f.*r3'. Die von find unterstützten regulären Ausdrücke sind standardmäßig Emacs-Reguläre Ausdrücke, dies kann jedoch mit der Option -regextype geändert
werden.
-samefile name
Die Datei bezieht sich auf denselben Inode wie name. Wenn -L aktiv ist, können dies auch symbolische Links sein.
-size n[cwbkMG]
Eine Datei verwendet weniger, mehr oder genau n Einheiten an Speicherplatz, aufgerundet. Die folgenden Suffixe können verwendet werden:
`b' für 512-Byte-Blöcke (dies ist die Standardeinstellung, wenn kein Suffix verwendet wird)
`c' für Bytes
`w' für Zwei-Byte-Wörter
`k' für Kibibyte (KiB, Einheiten von 1024 Bytes)
`M' für Mebibyte (MiB, Einheiten von 1024 * 1024 = 1048576 Bytes)
`G' für Gibibyte (GiB, Einheiten von 1024 * 1024 * 1024 = 1073741824 Bytes)
Die Größe ist einfach das st_size-Element der Struktur stat, die durch den lstat- (oder stat-)
Systemaufruf gefüllt wird, aufgerundet, wie oben gezeigt. Mit anderen Worten, sie ist konsistent mit dem Ergebnis
, das Sie mit ls -l erhalten. Beachten Sie, dass die Formatbezeichner %k' und%b' von -printf mit spärlichen Dateien anders umgehen. Das Suffix `b' bezeichnet immer 512-Byte-Blöcke und niemals
1024-Byte-Blöcke, was sich von dem Verhalten von -ls unterscheidet.
Die Präfixe + und - bedeuten größer als bzw. kleiner als, wie üblich; d. h. eine exakte Größe von n Einheiten stimmt nicht überein. Beachten Sie, dass die Größe auf die nächste Einheit aufgerundet wird. Daher ist -size -1M nicht gleichbedeutend mit -size -1048576c. Das erste stimmt nur mit leeren Dateien überein, das zweite mit Dateien von 0 bis 1.048.575 Byte.
-true Immer wahr.
-type c
Die Datei ist vom Typ c:
b Block (gepuffertes) Spezialgerät
c Zeichen (ungepuffertes) Spezialgerät
d Verzeichnis
p Benannte Pipe (FIFO)
f Normale Datei
l Symbolischer Link; dies ist niemals wahr, wenn die Option -L oder die Option -follow aktiv ist, es sei denn, der symbolische Link ist unterbrochen. Wenn Sie symbolische Links suchen möchten,
wenn -L aktiv ist, verwenden Sie -xtype.
s socket
D door (Solaris)
Um nach mehr als einem Typ gleichzeitig zu suchen, können Sie die kombinierte Liste der Typzeichen durch ein Komma `,' (GNU-Erweiterung) getrennt angeben.
-uid n Die numerische Benutzer-ID der Datei ist kleiner, größer oder genau n.
-used n
Die Datei wurde zuletzt weniger als, mehr als oder genau n Tage nach der letzten Änderung ihres Status geändert.
-user uname
Die Datei gehört dem Benutzer uname (numerische Benutzer-ID erlaubt).
-wholename muster
Siehe -path. Diese Alternative ist weniger portabel als -path.
-writable
Entspricht Dateien, die vom aktuellen Benutzer beschreibbar sind. Dies berücksichtigt Zugriffssteuerungslisten und andere Berechtigungsartefakte, die der -perm-Test ignoriert. Dieser Test verwendet die Systemaufruf-Funktion access(2) und kann daher von NFS-Servern mit UID-Mapping (oder Root-Squashing) ausgetrickst werden, da viele Systeme access(2) im Client-Kernel implementieren und daher nicht auf die UID-Mapping-Informationen auf dem Server zugreifen können.
-xtype c
Das Gleiche wie -type, es sei denn, die Datei ist ein symbolischer Link. Für symbolische Links: Wenn die Option -H oder -P angegeben wurde, ist dies wahr, wenn die Datei ein Link zu einer Datei des Typs c ist; wenn die Option -L angegeben wurde, ist dies wahr, wenn c l ist. Mit anderen Worten, für symbolische Links prüft -xtype den Typ
der Datei, auf die der Link verweist, während -type dies nicht tut. Wenn ein symbolischer Link unterbrochen ist (weil das, worauf er verweist, nicht existiert oder der Link auf sich selbst verweist), verhält sich -xtype wie -type.
-context muster
(Nur SELinux) Der Sicherheitskontext der Datei stimmt mit dem Glob-Muster überein.
AKTIONEN
-delete
Löscht Dateien oder Verzeichnisse; gibt true zurück, wenn die Löschung erfolgreich war. Wenn die Löschung fehlschlägt, wird eine Fehlermeldung ausgegeben und der Exit-Status von find ist nonzero (wenn er schließlich beendet wird).
Warnung: Vergessen Sie nicht, dass find die Befehlszeile als Ausdruck auswertet. Wenn Sie -delete zuerst verwenden, versucht find, alles unterhalb der von Ihnen angegebenen Startpunkte zu löschen.
Die Verwendung der Aktion -delete in der Befehlszeile aktiviert automatisch die Option -depth. Da -depth die Option -prune unwirksam macht, kann die Aktion -delete nicht sinnvoll mit -prune kombiniert werden.
Oft möchte der Benutzer eine find-Befehlszeile mit -print testen, bevor er -delete für die eigentliche Löschung hinzufügt. Um unerwartete Ergebnisse zu vermeiden, ist es in der Regel am besten, sich daran zu erinnern, -depth explizit während dieser früheren Testläufe zu verwenden.
Die Aktion -delete kann ein Verzeichnis nicht löschen, es sei denn, es ist leer.
Zusammen mit der Option -ignore_readdir_race ignoriert find Fehler der Aktion -delete, falls die Datei seit dem Lesen des übergeordneten Verzeichnisses verschwunden ist: es wird keine Fehlermeldung ausgegeben, der Exit-Code wird nicht auf nonzero geändert und der Rückgabewert der Aktion -delete ist true.
-exec Befehl ;
Führt den Befehl aus; gibt true zurück, wenn der Status 0 ist. Alle nachfolgenden Argumente für find werden als Argumente für den Befehl verwendet, bis ein Argument gefunden wird, das aus ;' besteht. Die Zeichenkette{}wird durch den aktuellen Dateinamen, der verarbeitet wird, an allen Stellen in den Argumenten des Befehls ersetzt, nicht nur in den Argumenten, in denen sie allein steht, wie es in einigen Versionen von find der Fall ist. Beide dieser Konstrukte müssen möglicherweise (mit einem`) oder in Anführungszeichen gesetzt werden, um sie vor der Erweiterung durch die Shell zu schützen. Siehe den Abschnitt EXEMPLE für Beispiele für die Verwendung der Option -exec. Der angegebene Befehl wird einmal für jede übereinstimmende Datei ausgeführt. Der Befehl wird im Startverzeichnis ausgeführt. Es gibt unvermeidliche Sicherheitsprobleme bei der Verwendung der Aktion -exec; Sie sollten stattdessen die Option -execdir verwenden.
-exec command {} +
Diese Variante der -exec-Option führt den angegebenen Befehl für die ausgewählten Dateien aus, aber die Befehlszeile wird erstellt, indem der Name jeder ausgewählten Datei am Ende angehängt wird; die Gesamtzahl der Aufrufe des Befehls wird deutlich geringer sein als die Anzahl der übereinstimmenden Dateien. Die Befehlszeile wird auf ähnliche Weise wie xargs seine Befehlszeilen erstellt. Es ist nur eine Instanz von {} innerhalb des Befehls zulässig, und sie muss am Ende, unmittelbar vor dem + stehen. Sie muss escaped (mit \) oder in Anführungszeichen gesetzt werden, um sie vor der Interpretation durch die Shell zu schützen. Der Befehl wird im Startverzeichnis ausgeführt. Wenn ein Aufruf mit der +-Form einen Wert ungleich Null als Exit-Status zurückgibt, gibt find einen Wert ungleich Null als Exit-Status zurück. Wenn find auf einen Fehler stößt, kann dies manchmal zu einem sofortigen Abbruch führen, so dass einige ausstehende Befehle möglicherweise überhaupt nicht ausgeführt werden. Aus diesem Grund führt -exec my-command ... {} + -quit möglicherweise nicht dazu, dass my-command tatsächlich ausgeführt wird. Diese Variante von -exec gibt immer true zurück.
-execdir command ;
-execdir command {} +
Ähnlich wie -exec, aber der angegebene Befehl wird im Unterverzeichnis ausgeführt, das die übereinstimmende Datei enthält, was nicht normalerweise das Verzeichnis ist, in dem Sie find gestartet haben. Wie bei -exec sollte {} in Anführungszeichen gesetzt werden, wenn find von einer Shell aus aufgerufen wird. Dies ist eine viel sicherere Methode zum Aufrufen von Befehlen, da sie Race Conditions bei der Auflösung der Pfade zu den übereinstimmenden Dateien vermeidet. Wie bei der -exec-Option erstellt die +-Form von -execdir eine Befehlszeile, um mehr als eine übereinstimmende Datei zu verarbeiten, aber jeder einzelne Aufruf des Befehls listet nur Dateien auf, die sich im selben Unterverzeichnis befinden. Wenn Sie diese Option verwenden, müssen Sie sicherstellen, dass Ihre Umgebungsvariable PATH nicht auf . verweist; andernfalls kann ein Angreifer beliebige Befehle ausführen, indem er eine entsprechend benannte Datei in einem Verzeichnis ablegt, in dem Sie -execdir ausführen werden. Dasselbe gilt für Einträge in PATH, die leer sind oder die keine absoluten Verzeichnisnamen sind. Wenn ein Aufruf mit der +-Form einen Wert ungleich Null als Exit-Status zurückgibt, gibt find einen Wert ungleich Null als Exit-Status zurück. Wenn find auf einen Fehler stößt, kann dies manchmal zu einem sofortigen Abbruch führen, so dass einige ausstehende Befehle möglicherweise überhaupt nicht ausgeführt werden. Das Ergebnis der Aktion hängt davon ab, ob die +- oder die --Variante verwendet wird; -execdir command {} + gibt immer true zurück, während -execdir command {} ; nur dann true zurückgibt, wenn der Befehl 0 zurückgibt.
-fls datei
True; wie -ls, aber in eine Datei schreiben, ähnlich wie -fprint. Die Ausgabedatei wird immer erstellt, auch wenn das Prädikat niemals übereinstimmt. Siehe den Abschnitt UNUSUAL FILENAMES für Informationen darüber, wie ungewöhnliche Zeichen in Dateinamen behandelt werden.
-fprint datei
True; den vollständigen Dateinamen in die Datei datei schreiben. Wenn die Datei nicht existiert, wenn find ausgeführt wird, wird sie erstellt; wenn sie existiert, wird sie abgeschnitten. Die Dateinamen /dev/stdout und /dev/stderr werden speziell behandelt; sie beziehen sich auf die Standardausgabe bzw. die Standardfehlerausgabe. Die Ausgabedatei wird immer erstellt, auch wenn das Prädikat niemals übereinstimmt. Siehe den Abschnitt UNUSUAL FILENAMES für Informationen darüber, wie ungewöhnliche Zeichen in Dateinamen behandelt werden.
-fprint0 datei
True; wie -print0, aber in eine Datei schreiben, ähnlich wie -fprint. Die Ausgabedatei wird immer erstellt, auch wenn das Prädikat niemals übereinstimmt. Siehe den Abschnitt UNUSUAL FILENAMES für Informationen darüber, wie ungewöhnliche Zeichen in Dateinamen behandelt werden.
-fprintf datei format
True; wie -printf, aber in eine Datei schreiben, ähnlich wie -fprint. Die Ausgabedatei wird immer erstellt, auch wenn das Prädikat niemals übereinstimmt. Siehe den Abschnitt UNUSUAL FILENAMES für Informationen darüber, wie ungewöhnliche Zeichen in Dateinamen behandelt werden.
-ls True; die aktuelle Datei im Format ls -dils auf der Standardausgabe auflisten. Die Blockanzahlen beziehen sich auf 1-KB-Blöcke, es sei denn, die Umgebungsvariable POSIXLY_CORRECT ist gesetzt, in diesem Fall werden 512-Byte-Blöcke verwendet. Siehe den Abschnitt UNUSUAL FILENAMES für Informationen darüber, wie ungewöhnliche Zeichen in Dateinamen behandelt werden.
-ok befehl ;
Wie -exec, aber zuerst den Benutzer fragen. Wenn der Benutzer zustimmt, den Befehl ausführen. Andernfalls einfach false zurückgeben. Wenn der Befehl ausgeführt wird, wird seine Standardeingabe aus /dev/null umgeleitet. Diese Aktion darf nicht zusammen mit der Option -files0-from angegeben werden.
Die Antwort auf die Eingabeaufforderung wird mit einem Paar regulärer Ausdrücke verglichen, um festzustellen, ob es sich um eine bestätigende oder eine ablehnende Antwort handelt. Dieser reguläre Ausdruck wird aus dem System abgerufen, wenn die Umgebungsvariable POSIXLY_CORRECT gesetzt ist, andernfalls aus den Übersetzungstabellen von find. Wenn das System keine geeignete Definition hat, wird die eigene Definition von find verwendet. In jedem Fall wird die Interpretation des regulären Ausdrucks selbst von den Umgebungsvariablen LC_CTYPE (Zeichenklassen) und LC_COLLATE (Zeichenbereiche und Äquivalenzklassen) beeinflusst.
-okdir befehl ;
Wie -execdir, aber zuerst auf die gleiche Weise wie bei -ok den Benutzer fragen. Wenn der Benutzer nicht zustimmt, einfach false zurückgeben. Wenn der Befehl ausgeführt wird, wird seine Standardeingabe aus /dev/null umgeleitet. Diese Aktion darf nicht zusammen mit der Option -files0-from angegeben werden.
-print True; den vollständigen Dateinamen auf der Standardausgabe ausgeben, gefolgt von einem Zeilenumbruch. Wenn Sie die Ausgabe von find in ein anderes Programm weiterleiten und die geringste Möglichkeit besteht, dass die Dateien, nach denen Sie suchen, einen Zeilenumbruch enthalten, sollten Sie die Option -print0 anstelle von -print ernsthaft in Betracht ziehen. Siehe den Abschnitt UNUSUAL FILENAMES für Informationen darüber, wie ungewöhnliche Zeichen in Dateinamen behandelt werden.
-print0
True; den vollständigen Dateinamen auf der Standardausgabe ausgeben, gefolgt von einem Nullzeichen (anstelle des Zeilenumbruchzeichens, das -print verwendet). Dies ermöglicht, dass Dateinamen, die Zeilenumbrüche oder andere Arten von Leerzeichen enthalten, von Programmen, die die find-Ausgabe verarbeiten, korrekt interpretiert werden. Diese Option entspricht der -0-Option von xargs.
-printf format
True; das Format auf der Standardausgabe ausgeben und dabei die Steuerzeichen \ und die Direktiven % interpretieren. Feldbreiten und Präzisionen können wie bei der C-Funktion printf(3) angegeben werden. Beachten Sie, dass viele der Felder als %s und nicht als %d ausgegeben werden, was bedeuten kann, dass Flags nicht wie erwartet funktionieren. Dies bedeutet auch, dass das --Flag funktioniert (es erzwingt eine linksbündige Ausrichtung der Felder). Im Gegensatz zu -print fügt -printf am Ende der Zeichenkette kein Zeilenumbruchzeichen hinzu. Die Steuerzeichen und Direktiven sind:
\a Alarmglocke.
\b Backspace.
\c Ab sofort keine weiteren Zeichen aus diesem Format mehr ausgeben und die Ausgabe leeren.
\f Formularvorschub.
\n Zeilenumbruch.
\r Wagenrücklauf.
\t Horizontaler Tabulator.
\v Vertikaler Tabulator.
\0 ASCII NUL.
\\ Ein Literal-Backslash (`\`).
\NNN Das Zeichen, dessen ASCII-Code NNN ist (oktal).
Ein Steuerzeichen `\` gefolgt von einem beliebigen anderen Zeichen wird als ein normales Zeichen behandelt, so dass beide ausgegeben werden.
%% Ein Literal-Prozentzeichen.
%a Die letzte Zugriffszeit der Datei im Format, das von der C-Funktion ctime(3) zurückgegeben wird.
%Ak Die letzte Zugriffszeit der Datei im durch k angegebenen Format, wobei k entweder `@` oder eine Direktive für die C-Funktion strftime(3) ist. Die folgende Liste ist unvollständig. Bitte beachten Sie die Dokumentation von strftime(3) für die vollständige Liste. Einige der Konvertierungsspezifikationszeichen sind möglicherweise nicht auf allen Systemen verfügbar, aufgrund von Unterschieden in der Implementierung der C-Funktion strftime(3).
@ Sekunden seit dem 1. Januar 1970, 00:00 GMT, mit Nachkommastelle.
Zeitfelder:
H Stunde (00..23)
I Stunde (01..12)
k Stunde (0..23)
l Stunde (1..12)
M Minute (00..59)
p AM oder PM der Gebietssprache
r Zeit, 12-Stunden-Format (hh:mm:ss [AP]M)
S Sekunde (00.00 .. 61.00). Enthält eine Nachkommastelle.
T Zeit, 24-Stunden-Format (hh:mm:ss.xxxxxxxxxx)
+ Datum und Uhrzeit, getrennt durch ein `+`, z. B. `2004-04-28+22:22:05.0`. Dies ist eine GNU-Erweiterung. Die Zeit wird in der aktuellen Zeitzone angegeben (die durch das Setzen der Umgebungsvariablen TZ beeinflusst werden kann). Das Sekundenfeld enthält eine Nachkommastelle.
X Zeitdarstellung der Gebietssprache (H:M:S). Das Sekundenfeld enthält eine Nachkommastelle.
Z Zeitzone (z. B. EDT) oder nichts, wenn keine Zeitzone ermittelt werden kann.
Felder für Datum und Uhrzeit:
a abgekürzter Wochentagsname (Son..Sa)
A voller Wochentagsname, variable Länge (Sonntag..Samstag)
b abgekürzter Monatsname (Jan..Dez)
B voller Monatsname, variable Länge (Januar..Dezember)
c Datum und Uhrzeit im lokalen Format (Sa Nov 04 12:02:33 EST 1989). Das Format ist das gleiche wie für ctime(3), daher gibt es keine Bruchteile in der Sekundenangabe, um die Kompatibilität mit diesem Format zu gewährleisten.
d Tag des Monats (01..31)
D Datum (mm/tt/jj)
F Datum (jjjj-mm-tt)
h wie b
j Tag des Jahres (001..366)
m Monat (01..12)
U Kalenderwoche des Jahres, wobei Sonntag der erste Tag der Woche ist (00..53)
w Tag der Woche (0..6)
W Kalenderwoche des Jahres, wobei Montag der erste Tag der Woche ist (00..53)
x Datum im lokalen Format (mm/tt/jj)
y letzte zwei Ziffern des Jahres (00..99)
Y Jahr (1970...)
%b Die Menge an Speicherplatz, die für diese Datei in 512-Byte-Blöcken verwendet wird. Da Speicherplatz in Vielfachen der Dateisystem-Blockgröße zugewiesen wird, ist dies normalerweise größer als %s/512, kann aber auch kleiner sein, wenn die Datei eine spärliche Datei ist.
%Bk Erstellungszeit der Datei, d. h. ihre Erstellungszeit, im durch k angegebenen Format, das das gleiche ist wie für %A. Diese Direktive erzeugt eine leere Zeichenfolge, wenn das zugrunde liegende Betriebssystem oder Dateisystem keine Erstellungszeiten unterstützt.
%c Letzte Statusänderungszeit der Datei im von der C-Funktion ctime(3) zurückgegebenen Format.
%Ck Letzte Statusänderungszeit der Datei im durch k angegebenen Format, das das gleiche ist wie für %A.
%d Tiefe der Datei im Verzeichnisbaum; 0 bedeutet, dass die Datei ein Ausgangspunkt ist.
%D Die Gerätenummer, auf der sich die Datei befindet (das Feld st_dev der Struktur stat), in dezimaler Form.
%f Gibt den Basisnamen aus; der Name der Datei, wobei alle führenden Verzeichnisse entfernt wurden (nur das letzte Element). Für / ist das Ergebnis /. Siehe den Abschnitt EXEMPLE für ein Beispiel.
%F Typ des Dateisystems, auf dem sich die Datei befindet; dieser Wert kann für -fstype verwendet werden.
%g Gruppenname der Datei oder numerische Gruppen-ID, wenn die Gruppe keinen Namen hat.
%G Numerische Gruppen-ID der Datei.
%h Verzeichnisname; die führenden Verzeichnisse des Dateinamens (alles außer dem letzten Element). Wenn der Dateiname keine Schrägstriche enthält (da er sich im aktuellen Verzeichnis befindet), wird der %h-Spezifizierer in . erweitert. Für Dateien, die selbst Verzeichnisse sind und einen Schrägstrich enthalten (einschließlich /), wird %h in eine leere Zeichenfolge erweitert. Siehe den Abschnitt EXEMPLE für ein Beispiel.
%H Ausgangspunkt, unter dem die Datei gefunden wurde.
%i Inode-Nummer der Datei (in dezimaler Form).
%k Die Menge an Speicherplatz, die für diese Datei in 1-KB-Blöcken verwendet wird. Da Speicherplatz in Vielfachen der Dateisystem-Blockgröße zugewiesen wird, ist dies normalerweise größer als %s/1024, kann aber auch kleiner sein, wenn die Datei eine spärliche Datei ist.
%l Ziel eines symbolischen Links (leere Zeichenfolge, wenn die Datei kein symbolischer Link ist).
%m Berechtigungsbits der Datei (in oktaler Form). Diese Option verwendet die „traditionellen“ Zahlen, die die meisten Unix-Implementierungen verwenden, aber wenn Ihre spezielle Implementierung eine ungewöhnliche Reihenfolge von Oktalberechtigungsbits verwendet, sehen Sie einen Unterschied zwischen dem tatsächlichen Wert des Dateimodus und der Ausgabe von %m. Normalerweise möchten Sie eine führende Null für diese Zahl haben, und dazu sollten Sie das # -Flag verwenden (z. B. `%#m`).
%M Datei-Berechtigungen (in symbolischer Form, wie für ls). Diese Direktive wird ab findutils 4.2.5 unterstützt.
%n Anzahl der Hardlinks zur Datei.
%p Dateiname.
%P Dateiname, wobei der Name des Ausgangspunkts, unter dem die Datei gefunden wurde, entfernt wurde.
%s Dateigröße in Bytes.
%S Datei-Sparsity. Dies wird als (BLOCKSIZE * st_blocks / st_size) berechnet. Der genaue Wert, den Sie für eine normale Datei einer bestimmten Länge erhalten, ist systemspezifisch. Normalerweise
haben jedoch spärliche Dateien Werte kleiner als 1.0, und Dateien, die indirekte Blöcke verwenden, können einen Wert haben, der größer als 1.0 ist. Im Allgemeinen ist die Anzahl der von einer Datei verwendeten Blöcke dateisystemabhängig. Der für BLOCKSIZE verwendete Wert ist systemspezifisch, beträgt aber normalerweise 512 Byte. Wenn die Dateigröße Null ist, ist der ausgegebene Wert undefiniert. Auf Systemen, die keine Unterstützung für st_blocks bieten, wird davon ausgegangen, dass die Datei-Sparsity 1.0 beträgt.
%t Letzte Änderungszeit der Datei im Format, das von der C-Funktion ctime(3) zurückgegeben wird.
%Tk Letzte Änderungszeit der Datei im durch k angegebenen Format, was das gleiche ist wie für %A.
%u Dateibenutzername oder numerische Benutzer-ID, falls der Benutzer keinen Namen hat.
%U Numerische Benutzer-ID der Datei.
%y Dateityp (wie in ls -l), U=unbekannter Typ (sollte nicht vorkommen).
%Y Dateityp (wie %y) und folgt symbolischen Links: `L'=Schleife, `N'=nicht vorhanden, `?' für alle anderen Fehler beim Bestimmen des Typs des Ziels eines symbolischen Links.
%Z (Nur SELinux) Sicherheitskontext der Datei.
%{ %[ %(
Reserviert für zukünftige Verwendung.
Ein `%'-Zeichen, gefolgt von einem beliebigen anderen Zeichen, wird verworfen, aber das andere Zeichen wird ausgegeben (verlassen Sie sich nicht darauf, da möglicherweise weitere
Formatierungszeichen hinzugefügt werden). Ein `%'-Zeichen am Ende des Formatierungsparameters führt zu undefiniertem Verhalten, da kein nachfolgendes Zeichen vorhanden ist. In einigen Gebietsschemas kann es Ihre Türschlüssel verstecken, während es in anderen die letzte Seite des Romans, den Sie lesen, entfernt.
Die Direktiven %m und %d unterstützen die Flags #, 0 und +, aber die anderen Direktiven nicht, selbst wenn sie Zahlen ausgeben. Numerische Direktiven, die diese Flags nicht unterstützen, sind G, U, b, D, k
und n. Das Formatierungsflag - wird unterstützt und ändert die Ausrichtung eines Feldes von rechtsbündig (was der Standard ist) in linksbündig.
Siehe den Abschnitt UNÜBLICHE DATEINAMEN, um Informationen darüber zu erhalten, wie ungewöhnliche Zeichen in Dateinamen behandelt werden.
-prune True; Wenn die Datei ein Verzeichnis ist, wird nicht in dieses Verzeichnis eingetaucht. Wenn -depth angegeben ist, hat -prune keine Auswirkung. Da -delete -depth impliziert, können Sie -prune
und -delete nicht sinnvoll zusammen verwenden. Um beispielsweise das Verzeichnis src/emacs und alle Dateien und Verzeichnisse darunter zu überspringen und die Namen der anderen gefundenen Dateien auszugeben, können Sie Folgendes tun: find . -path ./src/emacs -prune -o -print
-quit Beendet die Ausführung sofort (mit dem Rückgabewert Null, wenn keine Fehler aufgetreten sind). Dies unterscheidet sich von -prune, da -prune nur für den Inhalt der beschnittenen Verzeichnisse
gilt, während -quit einfach dazu führt, dass find sofort stoppt. Es bleiben keine Kindprozesse aktiv. Alle Befehlszeilen, die mit -exec ... + oder -execdir ... + erstellt wurden, werden aufgerufen, bevor
das Programm beendet wird. Nachdem -quit ausgeführt wurde, werden keine weiteren Dateien, die auf der Befehlszeile angegeben wurden, verarbeitet. Zum Beispiel wird find /tmp/foo /tmp/bar -print -quit nur
^ tmp/foo ausgeben.
Eine gängige Verwendung von -quit ist, die Suche im Dateisystem zu stoppen, sobald wir gefunden haben, wonach wir suchen. Zum Beispiel, wenn wir nur eine einzelne Datei finden möchten, können wir Folgendes tun: find / -name needle -print -quit
OPERATOREN
Aufgeführt in absteigender Reihenfolge der Priorität:
( expr )
Erzwingt Priorität. Da Klammern für die Shell spezielle Zeichen sind, müssen Sie diese normalerweise mit Anführungszeichen versehen. Viele der Beispiele in dieser Handbuchseite verwenden Backslashes zu
diesem Zweck: \(...\) anstelle von (...).
! expr Ist wahr, wenn expr falsch ist. Dieses Zeichen muss auch in der Regel vor der Interpretation durch die Shell geschützt werden.
-not expr
Entspricht ! expr, ist aber nicht POSIX-konform.
expr1 expr2
Zwei Ausdrücke hintereinander werden als durch ein implizites -a verbunden betrachtet; expr2 wird nicht ausgewertet, wenn expr1 falsch ist.
expr1 -a expr2
Entspricht expr1 expr2.
expr1 -and expr2
Entspricht expr1 expr2, ist aber nicht POSIX-konform.
expr1 -o expr2
Oder; expr2 wird nicht ausgewertet, wenn expr1 wahr ist.
expr1 -or expr2
Entspricht expr1 -o expr2, ist aber nicht POSIX-konform.
expr1 , expr2
Liste; sowohl expr1 als auch expr2 werden immer ausgewertet. Der Wert von expr1 wird verworfen; der Wert der Liste ist der Wert von expr2. Der Komma-Operator kann nützlich sein, um nach verschiedenen Arten von Dingen zu suchen, aber dabei nur einmal die Dateisystemhierarchie zu durchlaufen. Die Aktion -fprintf kann verwendet werden, um die verschiedenen übereinstimmenden Elemente in verschiedene Ausgabedateien aufzulisten.
Bitte beachten Sie, dass -a, wenn es implizit (z. B. durch zwei Tests, die ohne einen expliziten Operator dazwischen stehen) oder explizit angegeben wird, eine höhere Priorität hat als -o. Dies bedeutet,
dass find . -name afile -o -name bfile -print niemals afile ausgibt.
UNÜBLICHE DATEINAMEN
Viele der Aktionen von find führen zur Ausgabe von Daten, die von anderen Benutzern gesteuert werden. Dazu gehören Dateinamen, Größen, Änderungszeiten usw. Dateinamen sind ein potenzielles Problem, da sie
alle Zeichen enthalten können, mit Ausnahme von \0 und /. Ungewöhnliche Zeichen in Dateinamen können unerwartete und oft unerwünschte Auswirkungen auf Ihr Terminal haben (z. B. durch Ändern der
Einstellungen Ihrer Funktionstasten auf einigen Terminals). Ungewöhnliche Zeichen werden von verschiedenen Aktionen unterschiedlich behandelt, wie unten beschrieben.
-print0, -fprint0
Immer den exakten Dateinamen unverändert ausgeben, auch wenn die Ausgabe an ein Terminal erfolgt.
-ls, -fls
Ungewöhnliche Zeichen werden immer escaped. Leerzeichen, Backslash- und doppelte Anführungszeichen werden mit C-ähnlicher Escape-Sequenz ausgegeben (z. B. `\f', `\"'). Andere ungewöhnliche Zeichen werden mit einer Oktal-Escape-Sequenz ausgegeben. Andere druckbare Zeichen (bei -ls und -fls sind dies die Zeichen zwischen Oktal 041 und 0176) werden unverändert ausgegeben.
-printf, -fprintf
Wenn die Ausgabe nicht an ein Terminal erfolgt, wird sie unverändert ausgegeben. Andernfalls hängt das Ergebnis davon ab, welche Direktive verwendet wird. Die Direktiven %D, %F, %g, %G, %H, %Y und %y werden zu Werten erweitert, die nicht von den Dateibesitzern kontrolliert werden, und werden daher unverändert ausgegeben. Die Direktiven %a, %b, %c, %d, %i, %k, %m, %M, %n, %s, %t, %u und %U haben Werte, die von den Dateibesitzern kontrolliert werden, aber nicht verwendet werden können, um beliebige Daten an das Terminal zu senden, und werden daher unverändert ausgegeben. Die Direktiven %f, %h, %l, %p und %P werden in Anführungszeichen gesetzt. Diese Anführungszeichen werden auf die gleiche Weise wie für GNU ls durchgeführt. Dies ist nicht der gleiche Anführungsmechanismus wie für -ls und -fls. Wenn Sie entscheiden können, welches Format für die Ausgabe von find verwendet werden soll, ist es normalerweise besser, `\0' als Terminator zu verwenden, anstatt eine neue Zeile, da Dateinamen Leerzeichen und neue Zeilen enthalten können. Die Einstellung der Umgebungsvariablen LC_CTYPE wird verwendet, um zu bestimmen, welche Zeichen in Anführungszeichen gesetzt werden müssen.
-print, -fprint
Die Anführungszeichen werden auf die gleiche Weise wie für -printf und -fprintf behandelt. Wenn Sie find in einem Skript oder in einer Situation verwenden, in der die übereinstimmenden Dateien beliebige Namen haben können, sollten Sie die Verwendung von -print anstelle von -print in Betracht ziehen.
Die Aktionen -ok und -okdir geben den aktuellen Dateinamen unverändert aus. Dies kann sich in einer zukünftigen Version ändern.
KONFORMITÄT MIT STANDARDS
Um die grösstmögliche Konformität mit dem POSIX-Standard zu erreichen, sollten Sie die Umgebungsvariable POSIXLY_CORRECT setzen. Die folgenden Optionen sind im POSIX-Standard (IEEE Std 1003.1-2008, 2016 Edition) spezifiziert:
-H Diese Option wird unterstützt.
-L Diese Option wird unterstützt.
-name Diese Option wird unterstützt, aber die POSIX-Konformität hängt von der POSIX-Konformität der fnmatch(3)-Bibliotheksfunktion des Systems ab. Ab findutils-4.2.2 stimmen Shell-Metazeichen (`*', `?' oder `[]' beispielsweise) mit einem führenden `.' überein, da dies durch IEEE PASC-Interpretation 126 vorgeschrieben ist. Dies ist eine Änderung gegenüber früheren Versionen von findutils.
-type Wird unterstützt. POSIX spezifiziert `b', `c', `d', `l', `p', `f' und `s'. GNU find unterstützt auch `D', das eine Door darstellt, wobei das Betriebssystem diese bereitstellt. Darüber hinaus ermöglicht GNU find die Angabe mehrerer Typen gleichzeitig in einer durch Komma getrennten Liste.
-ok Wird unterstützt. Die Interpretation der Antwort erfolgt gemäss den durch die Einstellung der Umgebungsvariablen LC_MESSAGES ausgewählten Mustern `yes' und `no'. Wenn die Umgebungsvariable POSIXLY_CORRECT gesetzt ist, werden diese Muster aus der Systemdefinition einer positiven (yes) oder negativen (no) Antwort entnommen. Weitere Informationen finden Sie in der Systemdokumentation für nl_langinfo(3), insbesondere YESEXPR und NOEXPR. Wenn POSIXLY_CORRECT nicht gesetzt ist, werden die Muster stattdessen aus dem Nachrichten-Katalog von find entnommen.
-newer Wird unterstützt. Wenn die angegebene Datei ein symbolischer Link ist, wird dieser immer dereferenziert.
Dies ist eine Änderung gegenüber dem vorherigen Verhalten, bei dem die relevante Zeit vom symbolischen Link übernommen wurde; siehe den Abschnitt "HISTORY" unten.
-perm Wird unterstützt. Wenn die Umgebungsvariable POSIXLY_CORRECT nicht gesetzt ist, werden einige Modusargumente (z. B. +a+x), die in POSIX nicht gültig sind, zur Abwärtskompatibilität unterstützt.
Andere Primärfunktionen Die Primärfunktionen -atime, -ctime, -depth, -exec, -group, -links, -mtime, -nogroup, -nouser, -ok, -path, -print, -prune, -size, -user und -xdev werden alle unterstützt.
Der POSIX-Standard gibt Klammern `(', `)', Negation `!' und die logischen UND/ODER-Operatoren -a und -o an.
Alle anderen Optionen, Prädikate, Ausdrücke usw. sind Erweiterungen über den POSIX-Standard hinaus. Viele dieser Erweiterungen sind jedoch nicht einzigartig für GNU find.
Der POSIX-Standard schreibt vor, dass find Schleifen erkennt:
Das Dienstprogramm find muss unendliche Schleifen erkennen, d. h. das erneute Aufrufen eines zuvor besuchten Verzeichnisses, das ein Vorfahre der zuletzt aufgefundenen Datei ist. Wenn es eine unendliche Schleife erkennt, muss find eine Diagnosemeldung in die Standardfehlerausgabe schreiben und entweder seine Position in der Hierarchie wiederherstellen oder das Programm beenden.
GNU find erfüllt diese Anforderungen. Die Linkanzahl von Verzeichnissen, die Einträge enthalten, die harte Links zu einem Vorfahren sind, ist oft geringer als sie sein sollte. Dies kann bedeuten, dass GNU find manchmal das Besuchen eines Unterverzeichnisses, das tatsächlich ein Link zu einem Vorfahren ist, überspringt. Da find dieses Unterverzeichnis nicht tatsächlich aufruft, darf es die Ausgabe einer Diagnosemeldung vermeiden. Obwohl dieses Verhalten etwas verwirrend sein kann, ist es unwahrscheinlich, dass jemand tatsächlich von diesem Verhalten abhängt. Wenn die Leaf-Optimierung mit -noleaf deaktiviert wurde, wird der Verzeichniseintrag immer überprüft und die Diagnosemeldung dort ausgegeben, wo sie angemessen ist. Symbolische Links können nicht verwendet werden, um Dateisystemschleifen zu erstellen. Wenn die Option -L oder die Option -follow verwendet wird, wird jedoch eine Diagnosemeldung ausgegeben, wenn find eine Schleife von symbolischen Links findet. Wie bei Schleifen, die harte Links enthalten, bedeutet die Leaf-Optimierung oft, dass find weiß, dass es stat() oder chdir() auf den symbolischen Link nicht aufrufen muss, so dass diese Diagnose häufig nicht erforderlich ist.
Die Option -d wird zur Kompatibilität mit verschiedenen BSD-Systemen unterstützt, Sie sollten jedoch die POSIX-konforme Option -depth verwenden.
Die Umgebungsvariable POSIXLY_CORRECT hat keinen Einfluss auf das Verhalten der Tests -regex oder -iregex, da diese Tests nicht im POSIX-Standard definiert sind.
UMGEBUNGSVARIABLEN
LANG Stellt einen Standardwert für die Internationalisierungsvariablen bereit, die nicht gesetzt oder leer sind.
LC_ALL Wenn sie auf einen nicht leeren Zeichenkettenwert gesetzt ist, überschreibt sie die Werte aller anderen Internationalisierungsvariablen.
LC_COLLATE
Der POSIX-Standard legt fest, dass diese Variable die für die Option -name zu verwendende Musterabgleichsmethode beeinflusst. GNU find verwendet die Bibliotheksfunktion fnmatch(3), sodass die Unterstützung für LC_COLLATE von der Systembibliothek abhängt. Diese Variable beeinflusst auch die Interpretation der Antwort auf -ok; während die Variable LC_MESSAGES die tatsächlich zur Interpretation der Antwort auf -ok verwendete Zeichenkette auswählt, wird die Interpretation aller Klammerausdrücke in der Zeichenkette durch LC_COLLATE beeinflusst.
LC_CTYPE
Diese Variable beeinflusst die Behandlung von Zeichenklassen, die in regulären Ausdrücken verwendet werden, sowie mit dem Test -name, falls die fnmatch(3)-Bibliotheksfunktion des Systems dies unterstützt. Diese Variable beeinflusst auch die Interpretation aller Zeichenklassen in den regulären Ausdrücken, die zur Interpretation der von -ok ausgegebenen Eingabeaufforderung verwendet werden. Die Umgebungsvariable LC_CTYPE beeinflusst auch, welche Zeichen als nicht druckbare Zeichen betrachtet werden, wenn Dateinamen ausgegeben werden; siehe den Abschnitt UNUSÜBLICHE DATEINAMEN.
LC_MESSAGES
Bestimmt die zu verwendende Gebietsschema für internationalisierte Nachrichten. Wenn die Umgebungsvariable POSIXLY_CORRECT gesetzt ist, bestimmt sie auch die Interpretation der Antwort auf die von der Aktion -ok ausgegebene Eingabeaufforderung.
NLSPATH
Bestimmt den Speicherort der internationalen Nachrichtenkataloge.
PATH Beeinflusst die Verzeichnisse, in denen nach den durch -exec, -execdir, -ok und -okdir aufgerufenen ausführbaren Dateien gesucht wird.
POSIXLY_CORRECT
Bestimmt die Blockgröße, die von -ls und -fls verwendet wird. Wenn POSIXLY_CORRECT gesetzt ist, sind Blöcke 512 Byte groß. Andernfalls sind sie 1024 Byte groß.
Durch das Setzen dieser Variablen werden auch Warnmeldungen (d. h. implizit -nowarn) standardmäßig deaktiviert, da POSIX vorschreibt, dass alle auf stderr ausgegebenen Meldungen, mit Ausnahme der Ausgabe für -ok, Diagnosemeldungen sein müssen und einen Exit-Status von Null verursachen müssen.
Wenn POSIXLY_CORRECT nicht gesetzt ist, wird -perm +zzz genauso behandelt wie -perm /zzz, wenn +zzz kein gültiger symbolischer Modus ist. Wenn POSIXLY_CORRECT gesetzt ist, werden solche Konstrukte als Fehler behandelt.
Wenn POSIXLY_CORRECT gesetzt ist, wird die Antwort auf die von der Aktion -ok ausgegebene Eingabeaufforderung gemäß dem Nachrichtenkatalog des Systems und nicht gemäß den eigenen Übersetzungsmeldungen von find interpretiert.
TZ Beeinflusst die Zeitzone, die für einige der zeitbezogenen Formatierungsdirektiven von -printf und -fprintf verwendet wird.
BEISPIELE
Einfacher find|xargs-Ansatz
Findet Dateien mit dem Namen core in oder unterhalb des Verzeichnisses /tmp und löscht sie.
$ find /tmp -name core -type f -print | xargs /bin/rm -f
Beachten Sie, dass dies nicht korrekt funktioniert, wenn Dateinamen Zeilenumbrüche, einfache oder doppelte Anführungszeichen oder Leerzeichen enthalten.
Eine sicherere Variante von find -print0 | xargs -0
Durchsuchen Sie die Verzeichnisse unterhalb von /tmp nach Dateien mit dem Namen „core“ und löschen Sie diese, wobei die Dateinamen so verarbeitet werden, dass Dateinamen oder Verzeichnisnamen, die einzelne oder doppelte Anführungszeichen, Leerzeichen oder Zeilenumbrüche enthalten, korrekt behandelt werden.
$ find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
Der -name-Test erfolgt vor dem -type-Test, um zu vermeiden, dass stat(2) für jede Datei aufgerufen werden muss.
Beachten Sie, dass es immer noch ein Wettlauf zwischen dem Zeitpunkt ist, an dem find die Hierarchie durchläuft und die übereinstimmenden Dateinamen ausgibt, und dem Zeitpunkt, an dem der von xargs ausgeführte Prozess mit dieser Datei arbeitet.
Verarbeitung beliebiger Startpunkte
Angenommen, ein anderes Programm proggy filtert vor und erstellt eine große, durch NUL getrennte Liste von Dateien. Verwenden Sie diese als Startpunkte und suchen Sie alle regulären, leeren Dateien darin:
$ proggy | find -files0-from - -maxdepth 0 -type f -empty
Die Verwendung von -files0-from - bedeutet, dass die Namen der Startpunkte von der Standardeingabe gelesen werden, d. h. von der Pipe; und -maxdepth 0 stellt sicher, dass nur explizit diese Einträge untersucht werden, ohne in Verzeichnisse zu verzweigen (falls einer der Startpunkte ein Verzeichnis ist).
Ausführen eines Befehls für jede Datei
Führen Sie den Befehl file für jede Datei im aktuellen Verzeichnis oder darunter aus.
$ find . -type f -exec file '{}' \;
Beachten Sie, dass die geschweiften Klammern in einfache Anführungszeichen gesetzt sind, um zu verhindern, dass sie als Shell-Skript-Zeichen interpretiert werden. Das Semikolon wird in ähnlicher Weise durch die Verwendung eines Backslashs geschützt, obwohl auch hier einfache Anführungszeichen verwendet werden könnten.
In vielen Fällen ist es möglicherweise vorzuziehen, die Syntax -exec ... + oder noch besser -execdir ... + aus Gründen der Leistung und Sicherheit zu verwenden.
Durchlaufen Sie das Dateisystem nur einmal – für 2 verschiedene Aktionen
Durchlaufen Sie das Dateisystem nur einmal und listen Sie Dateien und Verzeichnisse mit gesetztem Benutzer-ID-Bit in /root/suid.txt und große Dateien in /root/big.txt auf.
$ find / \
\( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \
\( -size +100M -fprintf /root/big.txt '%-10s %p\n' \)
Dieses Beispiel verwendet das Zeilenfortsetzungszeichen \ in den ersten beiden Zeilen, um die Shell anzuweisen, die Befehlsausgabe in der nächsten Zeile fortzusetzen.
Suchen von Dateien nach Alter
Suchen Sie in Ihrem Home-Verzeichnis nach Dateien, die in den letzten vierundzwanzig Stunden geändert wurden.
$ find $HOME -mtime 0
Dieser Befehl funktioniert so, weil die Zeit seit der letzten Änderung jeder Datei durch 24 Stunden geteilt wird und der Rest verworfen wird. Das bedeutet, dass eine Datei, um mit -mtime 0 übereinzustimmen, eine Änderung in der Vergangenheit haben muss, die weniger als 24 Stunden zurückliegt.
Suchen von Dateien nach Berechtigungen
Suchen Sie nach Dateien, die ausführbar, aber nicht lesbar sind.
$ find /sbin /usr/sbin -executable \! -readable -print
Suchen Sie nach Dateien, die Lese- und Schreibberechtigungen für ihren Besitzer und ihre Gruppe haben, aber von anderen Benutzern gelesen, aber nicht geschrieben werden können.
$ find . -perm 664
Dateien, die diese Kriterien erfüllen, aber andere Berechtigungsbits gesetzt haben (z. B. wenn die Datei ausführbar ist), werden nicht gefunden.
Suche nach Dateien, die die Berechtigung zum Lesen und Schreiben für ihren Besitzer und ihre Gruppe haben und für die andere Benutzer die Leseberechtigung haben, unabhängig davon, ob zusätzliche Berechtigungsbits vorhanden sind (z. B. das ausführbare Bit).
$ find . -perm -664
Dies würde eine Datei finden, die den Modus 0777 hat, zum Beispiel.
Suche nach Dateien, die für jemanden (ihren Besitzer oder ihre Gruppe oder jemand anderen) beschreibbar sind.
$ find . -perm /222
Suche nach Dateien, die entweder von ihrem Besitzer oder ihrer Gruppe beschreibbar sind.
$ find . -perm /220
$ find . -perm /u+w,g+w
$ find . -perm /u=w,g=w
Alle drei dieser Befehle tun dasselbe, aber der erste verwendet die oktale Darstellung des Dateimodus, und die anderen beiden verwenden die symbolische Form. Die Dateien müssen nicht sowohl vom Besitzer als auch von der Gruppe beschreibbar sein, um gefunden zu werden; es reicht, wenn es einer von beiden ist.
Suche nach Dateien, die sowohl von ihrem Besitzer als auch von ihrer Gruppe beschreibbar sind.
$ find . -perm -220
$ find . -perm -g+w,u+w
Beide diese Befehle tun dasselbe.
Eine ausgefeiltere Suche nach Berechtigungen.
$ find . -perm -444 -perm /222 \! -perm /111
$ find . -perm -a+r -perm /a+w \! -perm /a+x
Diese beiden Befehle suchen beide nach Dateien, die für alle lesbar sind (-perm -444 oder -perm -a+r), bei denen mindestens ein Schreibbit gesetzt ist (-perm /222 oder -perm /a+w), die aber nicht für alle ausführbar sind (! -perm /111 oder ! -perm /a+x).
Beschneiden - Auslassen von Dateien und Verzeichnissen
Kopiere den Inhalt von /source-dir nach /dest-dir, aber lasse Dateien und Verzeichnisse mit dem Namen .snapshot (und alles darin) aus. Es werden auch Dateien oder Verzeichnisse ausgelassen, deren Name mit `~\' endet, aber nicht deren Inhalt.
$ cd /source-dir
$ find . -name .snapshot -prune -o \( \! -name '*~' -print0 \) \
| cpio -pmd0 /dest-dir
Die Konstruktion -prune -o ( ... -print0 ) ist ziemlich verbreitet. Die Idee ist, dass der Ausdruck vor -prune die Dinge abgleicht, die beschnitten werden sollen. Allerdings gibt die -prune-Aktion selbst true zurück, so dass die folgende -o sicherstellt, dass die rechte Seite nur für die Verzeichnisse ausgewertet wird, auf die -prune nicht angewendet wurde (der Inhalt der beschnittenen Verzeichnisse wird nicht einmal besucht, so dass ihr Inhalt irrelevant ist). Der Ausdruck auf der rechten Seite von -o steht nur der Klarheit halber in Klammern. Er betont, dass die -print0-Aktion nur für Dinge stattfindet, auf die -prune nicht angewendet wurde. Da die Standard-'und'-Bedingung zwischen Tests stärker bindet als -o, ist dies ohnehin der Standard, aber die Klammern helfen, das Geschehen zu verdeutlichen.
Gegeben ist das folgende Verzeichnis von Projekten und ihren zugehörigen SCM-Verwaltungsordnern. Führe eine effiziente Suche nach den Wurzeln der Projekte durch:
$ find repo/ \
\( -exec test -d '{}/.svn' \; \
-or -exec test -d '{}/.git' \; \
-or -exec test -d '{}/CVS' \; \
\) -print -prune
Beispielausgabe:
repo/project1/CVS
repo/gnu/project2/.svn
repo/gnu/project3/.svn
repo/gnu/project3/src/.svn
repo/project4/.git
In diesem Beispiel verhindert -prune, dass unnötigerweise in Verzeichnisse eingedrungen wird, die bereits gefunden wurden (z. B. wird nicht in project3/src gesucht, da project3/.svn bereits gefunden wurde), stellt aber sicher, dass die übergeordneten Verzeichnisse ( project2 und project3) gefunden werden.
Andere nützliche Beispiele
Suche nach mehreren Dateitypen.
$ find /tmp -type f,d,l
Suche nach Dateien, Verzeichnissen und symbolischen Links im Verzeichnis /tmp und übergibt diese Typen als durch Komma getrennte Liste (GNU-Erweiterung), was ansonsten äquivalent zu der längeren, aber portableren Variante ist:
$ find /tmp \( -type f -o -type d -o -type l \)
Suche nach Dateien mit dem bestimmten Namen needle und beende die Suche sofort, wenn die erste Datei gefunden wurde.
$ find / -name needle -print -quit
Demonstriert die Interpretation der Formatierungsdirektiven %f und %h der Option -printf für einige Randfälle. Hier ist ein Beispiel, das auch einige Ausgaben enthält.
$ find . .. / /tmp /tmp/TRACE compile compile/64/tests/find -maxdepth 0 -printf '[%h][%f]\n'
[.][.]
[.][..]
[][/]
[][tmp]
[/tmp][TRACE]
[.][compile]
[compile/64/tests][find]
RÜCKGABEWERTE
^ ind gibt den Wert 0 zurück, wenn alle Dateien erfolgreich verarbeitet wurden, und einen Wert größer als 0, wenn Fehler auftreten.
Dies ist eine absichtlich sehr breite Beschreibung, aber wenn der Rückgabewert ungleich Null ist, sollten Sie sich nicht auf die Korrektheit der Ergebnisse von find verlassen.
Wenn ein Fehler auftritt, kann find die Ausführung sofort beenden, ohne alle angegebenen Aktionen abzuschließen.
Beispielsweise werden möglicherweise nicht alle Startpunkte untersucht oder einige ausstehende Programmausführungen für -exec ... {} + oder -execdir ... {} + möglicherweise nicht ausgeführt.
HISTORIE
Ein find-Programm erschien in Version 5 von Unix als Teil des Programmer's Workbench-Projekts und wurde von Dick Haight geschrieben. Doug McIlroys A Research UNIX Reader: Annotated Excerpts from the Programmer’s Manual, 1971-1986 bietet einige zusätzliche Details; Sie können es online unter [https://www.cs.dartmouth.edu/~doug/reader.pdf] lesen.
GNU find wurde ursprünglich von Eric Decker geschrieben, mit Verbesserungen von David MacKenzie, Jay Plett und Tim Wood. Die Idee für find -print0 und xargs -0 stammt von Dan Bernstein.
KOMPATIBILITÄT
Ab findutils-4.2.2 stimmen Shell-Metazeichen (z. B. \*, ? oder []) in Dateinamenmustern mit einem führenden . überein, da die IEEE POSIX-Interpretation 126 dies erfordert.
Ab findutils-4.3.3 stimmt -perm /000 jetzt mit allen Dateien überein, anstatt mit keiner.
Zeitstempel mit Nanosekundenauflösung wurden in findutils-4.3.3 implementiert.
Ab findutils-4.3.11 setzt die Option -delete den Rückgabewert von find auf einen Wert ungleich Null, wenn sie fehlschlägt. find wird jedoch nicht sofort beendet. Zuvor wurde der Rückgabewert von find durch das Fehlschlagen von -delete nicht beeinflusst.
Funktion Hinzugefügt in Auch in
-files0-from 4.9.0
-newerXY 4.3.3 BSD
-D 4.3.1
-O 4.3.1
-readable 4.3.0
-writable 4.3.0
-executable 4.3.0
-regextype 4.2.24
-exec ... + 4.2.12 POSIX
-execdir 4.2.12 BSD
-okdir 4.2.12
-samefile 4.2.11
-H 4.2.5 POSIX
-L 4.2.5 POSIX
-P 4.2.5 BSD
-delete 4.2.3
-quit 4.2.3
-d 4.2.3 BSD
-wholename 4.2.0
-iwholename 4.2.0
-ignore_readdir_race 4.2.0
-fls 4.0
-ilname 3.8
-iname 3.8
-ipath 3.8
-iregex 3.8
Die Syntax -perm +MODE wurde in findutils-4.5.12 entfernt und durch -perm /MODE ersetzt. Die Syntax +MODE war bereits seit findutils-4.2.21, das im Jahr 2005 veröffentlicht wurde, als veraltet gekennzeichnet.
KEINE FEHLER
Überraschende Operator-Prioritäten
Der Befehl find . -name afile -o -name bfile -print wird niemals afile ausgeben, da dieser tatsächlich äquivalent zu find . -name afile -o ( -name bfile -a -print ) ist. Beachten Sie, dass die Priorität von -a höher ist als die von -o und wenn kein Operator zwischen den Tests angegeben wird, -a angenommen wird.
„Fehlermeldung: Pfade müssen der Ausdruck vorausgehen“ $ find . -name *.c -print find: Pfade müssen dem Ausdruck vorausgehen find: möglicherweise nicht in Anführungszeichen eingeschlossenes Muster nach dem Prädikat `-name'?
Dies geschieht, wenn die Shell das Muster *.c zu mehr als einem Dateinamen im aktuellen Verzeichnis erweitert und die resultierenden Dateinamen als Befehlszeilenargumente an find übergibt: find . -name frcode.c locate.c word_io.c -print Dieser Befehl funktioniert natürlich nicht, da das Prädikat -name genau nur ein Muster als Argument zulässt. Anstatt dies auf diese Weise zu tun, sollten Sie das Muster in Anführungszeichen setzen oder das Wildcardzeichen maskieren, damit find das Muster mit dem Wildcardzeichen während der Suche nach übereinstimmenden Dateinamen verwenden kann, anstatt dass die übergeordnete Shell die Dateinamen erweitert: $ find . -name '*.c' -print $ find . -name *.c -print
FEHLER
Es gibt inhärente Sicherheitsprobleme in dem Verhalten, das der POSIX-Standard für find vorgibt, und diese können daher nicht behoben werden. Zum Beispiel ist die Aktion -exec inhärent unsicher, und stattdessen sollte -execdir verwendet werden.
Die Umgebungsvariable LC_COLLATE hat keine Auswirkung auf die Aktion -ok.
FEHLER MELDEN
GNU findutils Online-Hilfe: [https://www.gnu.org/software/findutils/#get-help] Melden Sie alle Übersetzungsfehler unter [https://translationproject.org/team/].
Melden Sie alle anderen Probleme über das Formular im GNU Savannah-Fehler-Tracker: [https://savannah.gnu.org/bugs/?group=findutils] Allgemeine Themen zum GNU findutils-Paket werden in der Mailingliste bug-findutils diskutiert: [https://lists.gnu.org/mailman/listinfo/bug-findutils]
URHEBERRECHT
Copyright © 1990–2024 Free Software Foundation, Inc. Lizenz GPLv3+: GNU GPL Version 3 oder neuer [https://gnu.org/licenses/gpl.html]. Dies ist freie Software: Sie können sie ändern und weiterverteilen. Es gibt KEINE GARANTIE, in dem Umfang, wie es das Gesetz erlaubt.
SIEHE AUCH
chmod(1), locate(1), ls(1), updatedb(1), xargs(1), lstat(2), stat(2), ctime(3), fnmatch(3), printf(3), strftime(3), locatedb(5), regex(7)
Vollständige Dokumentation: [https://www.gnu.org/software/findutils/find] oder lokal verfügbar über: info find