Übersicht
Manchmal müssen Sie möglicherweise Dateien mit bestimmten Merkmalen im System finden (z. B. Dateiberechtigungen, Dateieigentümer, Dateilänge, Dateityp usw.). Dafür kann es viele Gründe geben. Vielleicht liegt es an Sicherheitsgründen, oder es handelt sich um eine allgemeine Systemverwaltungsaufgabe, oder vielleicht geht es einfach darum, eine Datei zu finden, die irgendwo gespeichert ist. find ist ein sehr effektives Tool, das das aktuelle Verzeichnis oder sogar das gesamte Dateisystem durchsuchen kann, um bestimmte Dateien oder Verzeichnisse zu finden.
Da find eine so leistungsstarke Funktion hat, verfügt es auch über viele Optionen, von denen es sich lohnt, die meisten zu verstehen. Auch wenn das System ein Network File System (NFS) enthält, ist der Find-Befehl auch im Dateisystem gültig, sofern Sie über die entsprechenden Berechtigungen verfügen.
Wenn ein Suchbefehl sehr ressourcenintensiv ausgeführt wird, tendieren viele Leute dazu, ihn im Hintergrund auszuführen, da das Durchsuchen eines großen Dateisystems lange dauern kann (hier bezieht sich auf Dateien über 30 GB im System).
Verwendung von find Befehl
find pathname -options [-print -exec -ok]
Das allgemeine Format des Suchbefehls ist:
find [-H] [-L] [-P] [Pfad...] [Ausdruck]
Wobei '-H' '-L' „-Die drei P“-Optionen werden hauptsächlich zur Verarbeitung symbolischer Links verwendet. „-H“ bedeutet, nur den in der Befehlszeile angegebenen symbolischen Links zu folgen. „-P“ bedeutet, dass alle symbolischen Links befolgt werden. was bedeutet nein. Folgen Sie dem symbolischen Link.
Zum Beispiel gibt es in meinem aktuellen Verzeichnis eine symbolische Verbindung e1000, und jetzt möchte ich die Quelldatei finden, deren letzter Buchstabe im Dateinamen eine Zahl ist, dann
$ find -H -name "*. [0-9 ].c" -print
./2234.c
Wenn Sie wie oben schreiben, können nur die Dateien im aktuellen Verzeichnis gefunden werden, die den Anforderungen entsprechen, nicht jedoch die Dateien unter e1000. Sie können also schreiben:
$ find -H e1000 . -name "*[0-9].c" -print
oder verwenden Sie die Option '-L'
$ find -L -name ". * [0-9].c“ Der Teil [path...] im Format -print
gibt an, dass dieses Verzeichnis als Stammverzeichnis für die Suche verwendet wird. [Ausdruck] im Format
ist ein Ausdruck. Die grundlegendsten Ausdrücke sind in drei Kategorien unterteilt: Einstellungselemente (Optionen), Testelemente (Tests) und Aktionselemente (Aktionen). Diese drei Kategorien können durch logische Operatoren (Operatoren) zu größeren und komplexeren Ausdrücken kombiniert werden. Modus. Die Einstellungselemente (z. B. - Depth, - Max Depth usw.) sind spezifisch für diese Suchaufgabe, nicht nur für eine bestimmte Datei. Die Einstellungselemente geben immer „true“ zurück. Es werden Übereinstimmungstests durchgeführt Eine bestimmte Datei, z. B. -name, -num, -user usw., gibt „true“ oder „false“ zurück; das Aktionselement (Aktion) führt eine Aktion für eine bestimmte Datei aus (am häufigsten, z. B. „-print“) und gibt „true“ oder „false“ zurück.
Es ist der Reichtum des [Ausdrucks]-Teils, der „find“ so kraftvoll macht. Dieser Teil ist komplizierter und wird später erläutert.
Suchbefehlsoptionen
Der Suchbefehl hat viele Optionen oder Ausdrücke, jeder Option ist ein Bindestrich vorangestellt. Schauen wir uns zunächst die Hauptoptionen dieses Befehls an und geben dann einige Beispiele.
-name Suche nach Dateien anhand des Dateinamens.
-perm Dateien basierend auf Dateiberechtigungen suchen.
-prune Verwenden Sie diese Option, um zu verhindern, dass der Suchbefehl im aktuell angegebenen Verzeichnis sucht. Wenn auch die Option - Depth verwendet wird, wird die Option -prune vom Suchbefehl ignoriert.
-user Dateien nach ihren Besitzern durchsuchen.
-group Suchen Sie nach Dateien entsprechend der Gruppe, zu der sie gehören.
-mtime -n oder +n sucht nach Dateien basierend auf ihrer Änderungszeit. -n gibt an, dass die Datei innerhalb von n Tagen geändert wurde, und +n gibt an, dass die Datei vor n Tagen geändert wurde. Der Befehl find verfügt auch über die Optionen -atime und -ctime, diese ähneln jedoch der Option -mtime, daher stellen wir hier nur die Option -mtime vor.
-nogroup Suchen Sie nach Dateien, die keine gültige Gruppe haben, zu der sie gehören, d. h. die Gruppe, zu der die Datei gehört, existiert nicht in /etc/groups.
-nouser Suche nach Dateien ohne gültigen Besitzer, d. h. der Besitzer der Datei existiert nicht in /etc/password.
-newer file1 ! file2 Findet Dateien, deren Änderungszeit neuer als Datei1, aber älter als Datei2 ist.
-type Suchen Sie nach einer Datei eines bestimmten Typs, z. B.:
b – Gerätedatei blockieren.
d – Verzeichnis.
c – Zeichengerätedatei.
p – Pipe-Datei.
l – symbolische Linkdatei.
f – normale Datei.
-size n[c] Suche nach Dateien mit einer Dateilänge von n Blöcken. Wenn c enthalten ist, wird die Dateilänge in Bytes gemessen.
- Depth Suchen Sie bei der Suche nach Dateien zuerst nach Dateien im aktuellen Verzeichnis und dann in seinen Unterverzeichnissen.
-fstype Suchen Sie nach Dateien, die sich in einem bestimmten Dateisystemtyp befinden. Diese Dateisystemtypen finden Sie normalerweise in der Konfigurationsdatei /etc/fstab. Diese Konfigurationsdatei enthält Informationen über das Dateisystem in diesem System.
-mount überschreitet bei der Suche nach Dateien nicht den Mountpunkt des Dateisystems.
-follow Wenn der Suchbefehl auf eine symbolische Linkdatei stößt, folgt er der Datei, auf die der Link verweist.
-cpio Verwenden Sie den Befehl cpio für übereinstimmende Dateien, um diese Dateien auf einem Bandgerät zu sichern.
Verwenden Sie die Namensoption.
Die Dateinamenoption ist die am häufigsten verwendete Option des Suchbefehls. Diese Option wird entweder allein oder zusammen mit anderen Optionen verwendet. Sie können ein Dateinamenmuster verwenden, um Dateien abzugleichen. Denken Sie daran, das Dateinamenmuster in Anführungszeichen zu setzen.
Wenn Sie unabhängig vom aktuellen Pfad eine Datei mit einem Dateinamen finden möchten, der mit *.txt in Ihrem Stammverzeichnis $HOME übereinstimmt, verwenden Sie ~ als Pfadnamenparameter, und die Tilde ~ stellt Ihr $HOME-Verzeichnis dar.
$ find ~ -name "*.txt" -print
Um alle '*.txt'-Dateien im aktuellen Verzeichnis und den Unterverzeichnissen zu finden, können Sie Folgendes verwenden:
$ find . -name "* .txt " -print
Um Dateien zu finden, deren Dateinamen im gewünschten aktuellen Verzeichnis und den Unterverzeichnissen mit einem Großbuchstaben beginnen, können Sie Folgendes verwenden:
$ find . -name "[A-Z]*" -print
Wenn Sie Wenn Sie Dateien im Verzeichnis /etc finden möchten, deren Dateinamen mit h o s t beginnen, können Sie Folgendes verwenden:
$ find /etc -name "host*" -print
Wenn Sie Dateien im aktuellen Verzeichnis finden möchten, deren Namen Beginnen Sie mit zwei Kleinbuchstaben, gefolgt von zwei Zahlen und schließlich der Datei
von * t x t. Der folgende Befehl kann die Datei mit dem Namen ax37.txt zurückgeben:
$ -name „[a-z]. [a-z][ 0--9][0--9].txt" -print
Verwenden Sie die Option perm
Wenn Sie Dateien entsprechend dem Dateiberechtigungsmodus suchen möchten, können Sie die Option -perm verwenden . Möglicherweise müssen Sie Dateien finden, für die alle Benutzer Ausführungsberechtigungen haben, oder Sie möchten die Dateiberechtigungstypen im Verzeichnis eines Benutzers anzeigen. Wenn Sie diese Option verwenden, verwenden Sie am besten die Oktalschreibweise für Berechtigungen. Um Dateien mit den Dateiberechtigungsbits 7 5 5 im aktuellen Verzeichnis zu finden, also Dateien, die der Dateieigentümer lesen, schreiben und ausführen kann und die andere Benutzer lesen und ausführen können, können Sie Folgendes verwenden:
$ find . -perm 755 -print Logische Operatoren
Die logischen Operatoren in find umfassen hauptsächlich die folgenden. Die Reihenfolge der Priorität von hoch nach niedrig ist wie folgt:
(expr)
Die Klammern haben die höchste Priorität. Erstens sind die Werte in den Klammern die Auswertung von
! expr2
ohne Operator, was dem Hinzufügen von „und“ zwischen den beiden, also der UND-Operation, entspricht, gibt nur dann true zurück, wenn beide Ausdruckswerte true sind. Der Ausdruck expr1 wird zuerst ausgewertet. Wenn er falsch ist, wird expr2 nicht ausgewertet.
expr1 -a expr2
Gleiches wie oben
expr1 -und expr2
Gleiches wie oben, aber POSIX unterstützt nicht
expr1 -o expr2
bedeutet ODER-Verknüpfung der Werte von Bei zwei Ausdrücken expr1 und expr2 ist der gesamte Ausdruck wahr, solange einer der linken und rechten Werte wahr ist. Der Ausdruck expr1 wird zuerst ausgewertet. Wenn er wahr ist, wird expr2 nicht ausgewertet.
expr1 -oder expr2
Dasselbe wie oben, aber POSIX unterstützt keine
expr1 , expr2
Komma-Ausdrücke. Sowohl expr1 als auch expr2 werden ausgewertet, aber nur der Wert von expr2 wird zurückgegeben. Der Wert von expr1 wird verworfen
Verwenden Sie die Prune-Option
-prune ist ein Aktionselement. Wenn es sich bei der Datei um eine Verzeichnisdatei handelt, geben Sie dieses Verzeichnis nicht für die Suche ein. Um die Aktion -prune zu verstehen, müssen Sie zunächst die Suchregeln des Suchbefehls verstehen (man kann auch sagen, dass der Algorithmus des Suchbefehls ist).
Der Suchbefehl durchläuft rekursiv den angegebenen Verzeichnisbaum und führt die Ausdrücke im Suchbefehl nacheinander für jede Datei aus. Die Ausdrücke werden zunächst gemäß logischen Operatoren kombiniert und dann von links nach rechts ausgewertet. Nehmen Sie den folgenden Code als Beispiel zur Erklärung
find PATHP1 OPT1 TEST1 ACT1 (TEST2 oder TEST3) ACT2
1 Führen Sie die Gesamteinstellungen des Suchbefehls entsprechend dem OPT1-Einstellungselement aus Führen Sie die folgenden Schritte nacheinander aus
2. Lassen Sie die Dateivariable File = PATHP1
3. Führen Sie den TEST1-Test für die Dateidatei aus. Wenn das Ausführungsergebnis falsch ist, fahren Sie mit (8) fort
4. Führen Sie die ACT1-Aktion für die Dateidatei aus. Wenn das Ausführungsergebnis falsch ist, fahren Sie mit (8) fort. Führen Sie den TEST2-Test für die Dateidatei aus. Fahren Sie mit (7) fort. Führen Sie den TEST3-Test für die Datei aus. Wenn das Ausführungsergebnis falsch ist, gehen Sie zu (8)
7. Führen Sie die Aktion ACT2 für die Datei aus.
8 -Prune-Aktion, geben Sie dieses Verzeichnis ein
9. Wenn ja, nehmen Sie eine Datei nacheinander, lassen Sie die Datei auf (3) verweisen Das aktuelle Verzeichnis ist PATHP1. Wenn dies der Fall ist, wird das Programm beendet. Wenn nicht, kehren Sie zum vorherigen Verzeichnis zurück und gehen Sie zu (9).
Nachdem Sie den obigen Vorgang verstanden haben, ist es nicht schwer zu verstehen, warum der folgende Code nur eins ausgibt. .'
$ find . -prune
.
Außerdem gibt es im aktuellen Verzeichnis zwei Dateien, die größer als 4090 Byte sind, und es gibt nur eine Datei, die größer als 4096 Byte ist, wie folgt:
$ find . -size +4090c -print
.
./a_book_of_c.chm
$ find . -size +4096c -print
./a_book_of_c.chm
Ersetzen Sie also die beiden oben genannten -print mit -prune, was geben diese beiden Befehle aus?
$ find . -size +4090c -prune
.
$ find . -size +4096c -prune
./a_book_of_c.chm
-prune wird oft mit -path oder -wholename verwendet , um ein bestimmtes Verzeichnis zu vermeiden, ist die übliche Form:
$ find PATH (-path
$ find . -size +0c -wholename "*e*[0-9]*" -o ! name "*phone" /) -prune -name "*.c" -user xixi -o -name "*phone"
Wenn Sie bei der Suche nach Dateien ein Verzeichnis ignorieren möchten, weil Sie wissen, dass Sie sich nicht darin befinden Verzeichnis Wenn Sie Dateien finden möchten, können Sie mit der Option -prune die Verzeichnisse angeben, die ignoriert werden müssen. Seien Sie vorsichtig, wenn Sie die Option -prune verwenden, denn wenn Sie auch die Option - Depth verwenden, wird die Option -prune vom Befehl find ignoriert.
Wenn Sie Dateien im /apps-Verzeichnis, aber nicht im /apps/bin-Verzeichnis finden möchten, können Sie Folgendes verwenden:
$ find /apps -name "/apps/bin" -prune -o -print
Verwenden Sie die Optionen user und nouser
Wenn Sie die Datei anhand des Dateieigentümers finden möchten, können Sie den entsprechenden Benutzernamen angeben. Um beispielsweise eine Datei zu finden, deren Eigentümer dave im Verzeichnis $HOME ist, können Sie Folgendes verwenden:
$ find ~ -user dave -print
, um eine Datei zu finden, deren Eigentümer uucp im Verzeichnis /etc ist:
$ find /etc -user uucp -print
Um Dateien zu finden, deren Besitzerkonto gelöscht wurde, können Sie die Option -nouser verwenden. Dadurch können Sie Dateien finden, deren Besitzer kein gültiges Konto in der Datei /etc/password haben. Wenn Sie die Option -nouser verwenden, müssen Sie keinen Benutzernamen angeben; der Suchbefehl
erledigt die Arbeit für Sie. Wenn Sie beispielsweise alle derartigen Dateien im Verzeichnis /home finden möchten, können Sie Folgendes verwenden:
$ find /home -nouser -print
Verwenden Sie die Optionen group und nogroup
Genau wie user und nouser Optionen für Dateien Der Befehl „find“ hat auch die gleiche Option für die Benutzergruppe, zu der er gehört. Um Dateien zu finden, die zur Benutzergruppe „accts“ im Verzeichnis /apps gehören, können Sie Folgendes verwenden:
$ find /apps -group accts -print
Um keine gültigen Dateien zu finden. Für alle Dateien, die zu einer Benutzergruppe gehören, können Sie die Option nogroup verwenden. Der folgende Suchbefehl findet solche Dateien aus dem Stammverzeichnis des Dateisystems
$ fine / -nogroup -print
Dateien nach Änderungszeit suchen
Wenn Sie Dateien nach Änderungszeit suchen möchten, können Sie die verwenden mtime-Option. Wenn dem System plötzlich der freie Speicherplatz ausgeht, ist es sehr wahrscheinlich, dass die Länge einer bestimmten Datei in diesem Zeitraum stark zugenommen hat. In diesem Fall können Sie die Option mtime verwenden, um eine solche Datei zu finden. Verwenden Sie das Minuszeichen –, um die Dateien zu begrenzen, die innerhalb von n Tagen geändert wurden, und verwenden Sie das Pluszeichen +, um die Dateien zu begrenzen, die vor n Tagen geändert wurden.
Wenn Sie Dateien mit einer Änderungszeit innerhalb von 5 Tagen im Systemstammverzeichnis finden möchten, können Sie Folgendes verwenden:
$ find / -mtime -5 -print
Um Dateien mit einer Änderungszeit innerhalb von 3 Tagen zu finden im Verzeichnis /var/adm Für Dateien, die älter als 20 Tage sind, können Sie Folgendes verwenden:
$ find /var/adm -mtime +3 -print
Verwenden Sie die neuere Option
Wenn Sie alle Dateien finden möchten, deren Änderungszeit neuer als eine bestimmte Datei, aber älter als eine andere Datei ist, können Sie die Option -newer verwenden. Seine allgemeine Form ist:
neuester_Dateiname ! ältester_Dateiname
wo, ! ist ein logisches NICHT-Symbol. Hier sind zwei Dateien, die im Abstand von etwa zwei Tagen geändert wurden.
Der unten angegebene Suchbefehl kann Dateien finden, deren Änderungszeit neuer als die Datei age.awk, aber älter als die Datei belts.awk ist:
$find -newer age.awk ! awk - exec ls -l {} ;
Wenn Sie diese Option des Suchbefehls verwenden möchten, um Dateien zu finden, die innerhalb von zwei Stunden geändert wurden, es sei denn, es gibt eine vorhandene Datei, deren Änderungszeit genau zwei Stunden zurückliegt, wird dies der Fall sein Es werden keine Dateien verwendet, mit denen Änderungszeiten verglichen werden können. Um dieses Problem zu lösen, können Sie zunächst eine Datei erstellen und deren Datum und Zeitstempel auf die gewünschte Zeit einstellen. Dies kann mit dem Touch-Befehl erreicht werden.
Angenommen, die aktuelle Zeit ist 2 3: 4 0 und Sie möchten Dateien finden, die innerhalb von zwei Stunden geändert wurden. Sie können zunächst eine Datei wie diese erstellen:
Es wurde eine Datei erstellt, die den Anforderungen entspricht. Wir gehen hier davon aus, dass heute der 4. Mai ist und die Änderungszeit der Datei 21:40 Uhr ist, also genau zwei Stunden früher als jetzt.
Jetzt können wir die Option -newer des Befehls find verwenden, um alle Dateien im aktuellen Verzeichnis zu finden, die innerhalb von zwei Stunden geändert wurden:
$ find . -newer dstamp -print
Verwenden Sie die Option type
Es gibt verschiedene Dateitypen in Unix- oder Linux-Systemen. Wir haben dies bereits im vorherigen Kapitel getan.
Wenn Sie alle Verzeichnisse im Verzeichnis /etc finden möchten, können Sie Folgendes verwenden:
$ find /etc - Geben Sie d -print ein
Um alle Dateitypen außer Verzeichnissen im aktuellen Verzeichnis zu finden, können Sie Folgendes verwenden:
$ find ! -type d -print
Um alle Symbole im /etc-Verzeichnis zu finden Wenn Sie Dateien verknüpfen möchten, können Sie Folgendes verwenden:
$ find /etc -type l -print
Verwenden Sie die Größenoption
, um Dateien anhand ihrer Länge zu finden. Die hier angegebene Dateilänge kann in Blöcken gemessen werden. kann auch in Bytes gemessen werden. Die Ausdrucksform der in Bytes gemessenen Dateilänge ist N c; die in Blöcken gemessene Dateilänge kann nur durch Zahlen ausgedrückt werden. Persönlich verwende ich immer Bytes und wenn ich nach Dateien nach Dateilänge suche, verwenden die meisten Leute lieber diese Dateilänge in Bytes als die Anzahl der Blöcke, es sei denn, es geht um die Größe des Dateisystems, da die Konvertierung mithilfe von Blockmaßen einfacher ist.
Um Dateien mit einer Länge von mehr als 1 MB im aktuellen Verzeichnis zu finden, können Sie Folgendes verwenden:
$ find -size +1000000c -print
Um Dateien in /home/apache zu finden Verzeichnis mit einer Länge von genau 1 0 0 Bytes können Sie Folgendes verwenden:
$ find /home/apache -size 100c -print
Um Dateien zu finden, die länger als 1 0 Blöcke im aktuellen Verzeichnis sind ( ein Block entspricht 5 1 2 Bytes), Sie können Folgendes verwenden:
$ find Zuerst und dann in Unterverzeichnissen suchen. Sie können die Option „Tiefe“ verwenden, um den Befehl „Suchen“ dazu zu veranlassen, dies zu tun. Ein Grund dafür ist, dass Sie bei Verwendung des Befehls „find“ zum Sichern eines Dateisystems auf Band zuerst alle Dateien und dann die Dateien im Unterverzeichnis sichern möchten.
Im folgenden Beispiel startet der Suchbefehl im Stammverzeichnis des Dateisystems und sucht nach einer Datei mit dem Namen CON.FILE.
Es werden zuerst alle Dateien abgeglichen und dann in Unterverzeichnissen gesucht.
$ find / -name "CON.FILE" - Depth -print
Verwenden Sie die Mount-Option
, um Dateien im aktuellen Dateisystem zu finden (ohne andere Dateisysteme einzugeben). Sie können die Mount-Option von verwenden der f i n d-Befehl.
Im folgenden Beispiel beginnen wir mit der Suche nach Dateien in diesem Dateisystem, deren Dateinamen mit X C enden:
$ find .XC" -mount -print
Verwenden cpio-Option
cpio-Befehl kann zum Sichern von Dateien auf Bandgeräten oder zum Wiederherstellen von Dateien von Bandgeräten verwendet werden. Sie können den Befehl „find“ verwenden, um Dateien im gesamten Dateisystem (häufiger in Teilen des Dateisystems) zu finden und diese dann mit dem Befehl „cpio“ auf Band zu sichern. Wenn Sie den cpio-Befehl zum Sichern von Dateien in den Verzeichnissen /etc/, /home/ und /apps verwenden möchten, können Sie den unten angegebenen Befehl verwenden. Denken Sie jedoch daran, dass Sie sich im Stammverzeichnis des Dateisystems befinden:
$cd /
$find etc home apps -third -print |. cpio -ivcdC65536 -o /dev/rmt0
(Im obigen Beispiel teilt der Befehl am Ende der ersten Zeile der Shell mit, dass der Befehl noch nicht beendet wurde , und der anschließende Wagenrücklauf wird ignoriert)
Im obigen Beispiel sollten Sie bemerken, dass / im Pfad fehlt, der als relativer Pfad bezeichnet wird. Der Grund für die Verwendung relativer Pfade liegt darin, dass Sie beim Wiederherstellen dieser Dateien vom Band den Pfad zum Wiederherstellen der Dateien auswählen können. Sie können diese Dateien beispielsweise zunächst in einem anderen Verzeichnis wiederherstellen, bestimmte Vorgänge an ihnen ausführen und sie dann im ursprünglichen Verzeichnis wiederherstellen. Wenn während der Sicherung ein absoluter Pfad verwendet wird, z. B. /etc, können Sie während der Wiederherstellung nur im Verzeichnis /etc wiederherstellen und haben keine andere Wahl. Im
-Beispiel oben habe ich dem Befehl find gesagt, er solle zuerst in das Verzeichnis /etc gehen, dann in die Verzeichnisse /home und /apps, zuerst die Dateien in diesen Verzeichnissen abgleichen und dann die Dateien in ihren Unterverzeichnissen abgleichen, was alles geschieht Das Ergebnis wird zur Sicherung an den cpio-Befehl weitergeleitet. Im obigen Beispiel verwendet der cpio-Befehl übrigens die Option B, aber auf diese Weise beträgt die Größe jedes Blocks nur 5 1 2 Bytes. Nach Verwendung der Option C65536 beträgt die Blockgröße 64 KB (65536/1024).
Verwenden Sie exec oder ok, um Shell-Befehle auszuführen.
Nachdem Sie einige Dateien abgeglichen haben, möchten Sie möglicherweise bestimmte Vorgänge für sie ausführen. In diesem Fall können Sie die Option -exec verwenden. Die Option
Um die Exec-Option nutzen zu können, muss gleichzeitig die Print-Option genutzt werden. Wenn Sie den Befehl find überprüfen, werden Sie feststellen, dass der Befehl nur den relativen Pfad und Dateinamen vom aktuellen Pfad ausgibt.
Um den Befehl ls -l zum Auflisten der übereinstimmenden Dateien zu verwenden, können Sie den Befehl ls -l in die Option -exec des Befehls find einfügen, zum Beispiel:
Im obigen Beispiel gleicht der Befehl „find“ alle gewöhnlichen Dateien im aktuellen Verzeichnis ab und verwendet den Befehl „ls -l“ in der Option „-exec“, um sie aufzulisten.
Um Dateien im /logs-Verzeichnis zu finden, die vor mehr als 5 Tagen geändert wurden, und sie zu löschen, können Sie Folgendes verwenden:
$ find logs -type f -mtime +5 -exec rm {} ;
Denken Sie daran: Bevor Sie eine Datei in irgendeiner Weise in der Shell löschen, sollten Sie zunächst die entsprechende Datei überprüfen. Seien Sie vorsichtig! Der abgesicherte Modus mit der Option -exec kann verwendet werden, wenn Befehle wie mv oder rm verwendet werden. Sie werden vor der Bearbeitung jeder übereinstimmenden Datei aufgefordert. Im folgenden Beispiel sucht der Befehl find nach allen Dateien im aktuellen Verzeichnis, deren Dateinamen mit LOG enden und deren Änderungszeit mehr als 5 Tage zurückliegt, und löscht sie, gibt jedoch vor dem Löschen eine Eingabeaufforderung aus.
Drücken Sie die Y-Taste, um die Datei zu löschen. Drücken Sie die N-Taste, um sie nicht zu löschen.
Jede Befehlsform kann mit der Option -exec verwendet werden. Im folgenden Beispiel verwenden wir den Befehl grep. Der Befehl „find“ gleicht zunächst alle Dateien mit dem Namen „password*“ ab, z. B. „password“, „password.old“ und „password.bak“, und führt dann den Befehl „grep“ aus, um festzustellen, ob sich in diesen Dateien ein Rounder-Benutzer befindet.
$ find . -regex ".*/[0-9]*/.c" -print
./2234.c
Hier beziehen sich „-wholename“ und „-path“ auf den oben genannten vollständigen Pfad.
-wholename und -path sind beide Testelemente und haben die gleichen Funktionen. -path vermittelt den Leuten buchstäblich die Illusion, dass es nur mit Pfadnamen (oder Verzeichnisnamen) übereinstimmt. Tatsächlich kann es auch mit Dateinamen übereinstimmen, daher ist der Name -wholename passender. Schauen Sie sich dieses Beispiel an. Im aktuellen Verzeichnis gibt es eine Datei mit dem Namen puk.txt. Verwenden Sie -path:
$ -path '*phone/pu*' ./phone /puk.txt
Noch etwas zu erwähnen: Das allgemeine Format der Verwendung von -path ist: find [path ...] -path pattern ...
Es bedeutet: im [path ...] angeben .. .] Teil Verwenden Sie im Pfad Muster, um den vollständigen Dateinamen aller Dateien abzugleichen, anstatt nach Dateien in Verzeichnissen mit ähnlichen Mustern zu suchen.
Ausgabeformat
Wenn Sie die gewünschte Datei nicht finden und den Dateinamen monoton ausgeben möchten, können Sie das Aktionselement -printf verwenden, um das gewünschte Format auszugeben. printf-Aktion:
%p Dateiname ausgeben, einschließlich Pfadname
%f Dateiname ausgeben, ohne Pfadnamen
%m Dateiberechtigungen im Oktalformat ausgeben
%g Die Gruppe ausgeben, zu der die Datei gehört gehört
%h Der Name des Verzeichnisses, in dem sich die Ausgabedatei befindet
%u Der Besitzername der Ausgabedatei
...
Zum Beispiel:
$ -user xixi -printf "%m %p //n "
644 ./phone1/hello.c
644 ./0dfe.c
find und xargs
Bei Verwendung der Option -exec von Der Befehl „find“ dient zum Verarbeiten der übereinstimmenden Datei. Der Befehl „find“ übergibt alle übereinstimmenden Dateien zur Ausführung an exec. Leider gibt es auf einigen Systemen Beschränkungen hinsichtlich der Länge der Befehle, die an exec übergeben werden können, sodass ein Überlauffehler auftritt, nachdem der Befehl „find“ einige Minuten lang ausgeführt wurde. Die Fehlermeldung lautet meist „Parameterspalte zu lang“ oder „Parameterspalte übergelaufen“. Hier kommt der Befehl
xargs ins Spiel, insbesondere in Verbindung mit dem Befehl find. Der Befehl „find“ übergibt die übereinstimmenden Dateien an den Befehl „xargs“, und der Befehl „x a rg s“ ruft im Gegensatz zur Option „-exec“ nur einen Teil der Datei und nicht alle auf einmal ab. Auf diese Weise kann es den ersten Stapel an Dateien verarbeiten, den es erhält, dann den nächsten Stapel und so weiter. In einigen Systemen wird durch die Verwendung der Option -exec ein entsprechender Prozess zur Verarbeitung jeder übereinstimmenden Datei initiiert. Anstatt alle übereinstimmenden Dateien gleichzeitig als Parameter auszuführen, gibt es zu viele Prozesse und das System weist ein Problem auf Da es zu Leistungseinbußen kommt, ist die Effizienz nicht hoch. Bei Verwendung des Befehls xargs gibt es nur einen Prozess. Darüber hinaus wird bei Verwendung des Befehls xargs anhand der Optionen des Befehls und der entsprechenden Anzahl einstellbarer Parameter im Systemkernel bestimmt, ob alle Parameter auf einmal oder in Stapeln abgerufen werden sollen und wie viele Parameter jedes Mal abgerufen werden sollen. .
Das folgende Beispiel sucht nach jeder gewöhnlichen Datei im System und verwendet dann den Befehl xargs, um zu testen, zu welchen Dateitypen sie gehören: Das folgende Beispiel sucht nach Speicherinformations-Dump-Dateien (Core-Dumps) im gesamten System und speichert dann die Ergebnisse. Gehen Sie zur Datei /tmp/core.log:
$ find . -name "core" -print | /apps/audit-Verzeichnis Alle Dateien, für die der Benutzer Lese-, Schreib- und Ausführungsberechtigungen hat, und entziehen Sie die entsprechenden Schreibberechtigungen:
$ find /apps/audit -perm -7 -print | Im folgenden Beispiel verwenden wir den Befehl gr e p, der in allen gewöhnlichen Dateien nach dem Wort „device“ sucht:
$ find / -type f -print |. Im folgenden Beispiel verwenden wir den Befehl „grep“. um nach allen gewöhnlichen Dateien im aktuellen Verzeichnis zu suchen. Suchen Sie nach dem Wort DBO in:
$ find .