So verwenden Sie den find-Befehl in Linux

0
136
fatmawati achmad zaenuri/Shutterstock

Der Linux-Befehl find eignet sich hervorragend zum Suchen nach Dateien und Verzeichnissen. Sie können die Ergebnisse der Suche aber auch an andere Programme zur weiteren Verarbeitung übergeben. Wir zeigen Ihnen wie.

Der Linux-Befehl find

Der Linux-Befehl find ist leistungsstark und flexibel. Es kann nach Dateien und Verzeichnissen nach einer ganzen Reihe verschiedener Kriterien suchen, nicht nur nach Dateinamen. Es kann beispielsweise nach leeren Dateien, ausführbaren Dateien oder Dateien suchen, die einem bestimmten Benutzer gehören. Es kann Dateien anhand ihrer Zugriffs- oder Änderungszeiten finden und auflisten, Sie können Regex-Muster verwenden, es ist standardmäßig rekursiv und funktioniert mit Pseudodateien wie Named Pipes (FIFO-Puffer).

RELATEDSo verwenden Sie alle Linux-Suchbefehle

All of das ist wahnsinnig nützlich. Der bescheidene find-Befehl hat wirklich einiges an Kraft. Aber es gibt einen Weg, diese Macht zu nutzen und die Dinge auf eine andere Ebene zu bringen. Wenn wir die Ausgabe des Find-Befehls nehmen und automatisch als Eingabe anderer Befehle verwenden können, können wir etwas mit den Dateien und Verzeichnissen passieren, die find für uns aufdeckt.

Das Prinzip, die Ausgabe eines Befehls in einen anderen Befehl zu leiten, ist ein Kernmerkmal von Unix-abgeleiteten Betriebssystemen. Das Entwurfsprinzip, ein Programm dazu zu bringen, eine Sache gut zu machen, und zu erwarten, dass seine Ausgabe die Eingabe eines anderen Programms sein könnte—sogar ein noch ungeschriebenes Programm—wird oft als “Unix . bezeichnet Philosophie.” Dennoch akzeptieren einige Kerndienstprogramme, wie mkdir, keine über Pipe geleiteten Eingaben.

VERWANDTEVerwendung des xargs-Befehls unter Linux

Um diesen Mangel zu beheben, kann der xargs-Befehl verwendet werden, um über die Pipe geleitete Eingaben zu bündeln und sie in andere Befehle einzuspeisen, als wären sie Befehlszeilenparameter für diesen Befehl. Dies erreicht fast dasselbe wie eine einfache Verrohrung. Das ist “fast das gleiche” Ding, und nicht “genau dasselbe” Sache, weil es unerwartete Unterschiede bei Shell-Erweiterungen und Dateinamensglobbing geben kann.

Verwenden von find mit xargs

Wir können find mit xargs verwenden, um eine Aktion an den gefundenen Dateien auszuführen. Dies ist ein langwieriger Weg, aber wir könnten die von find gefundenen Dateien in xargs einspeisen, die sie dann in tar umleiten, um eine Archivdatei dieser Dateien zu erstellen. Wir führen diesen Befehl in einem Verzeichnis aus, das viele PAGE-Dateien des Hilfesystems enthält.

find ./-name “*.page” -type f -print0 | xargs -0 tar -cvzf page_files.tar.gz

Der Befehl besteht aus verschiedenen Elementen.

  • find ./-name “*.page” -type f -print0:  Die Suchaktion beginnt im aktuellen Verzeichnis und sucht anhand des Namens nach Dateien, die der “*.page” Suchbegriff. Verzeichnisse werden nicht aufgelistet, da wir ausdrücklich anweisen, nur nach Dateien mit dem -type f zu suchen. Das Argument print0 weist find an, Leerzeichen nicht als Ende eines Dateinamens zu behandeln. Das bedeutet, dass Dateinamen mit Leerzeichen korrekt verarbeitet werden.
  • xargs -o: Die -0 Argumente xargs um Leerzeichen nicht als Ende eines Dateinamens zu behandeln.
  • tar -cvzf page_files.tar.gz: Dies ist der Befehl, mit dem xargs die Dateiliste von find nach füttert. Das Dienstprogramm tar erstellt eine Archivdatei namens “page_files.tar.gz.”

Werbung

Wir können ls verwenden, um die erstellte Archivdatei anzuzeigen für uns.

ls *.gz

Die Archivdatei ist für uns erstellt. Damit dies funktioniert, müssen alle Dateinamen en masse an tar übergeben werden, was auch passiert ist. Alle Dateinamen wurden am Ende des tar-Befehls als sehr lange Befehlszeile markiert.

Sie können wählen, ob der letzte Befehl für alle Dateinamen gleichzeitig ausgeführt oder einmal pro Dateiname aufgerufen wird. Wir können den Unterschied ganz einfach erkennen, indem wir die Ausgabe von xargs an das Dienstprogramm zum Zählen von Zeilen und Zeichen wc weiterleiten.

Dieser Befehl leitet alle Dateinamen gleichzeitig an wc weiter. Effektiv erstellt xargs eine lange Befehlszeile für wc mit jedem der darin enthaltenen Dateinamen.

find . -name “*.page” -type f -print0 | xargs -0 wc

Die Zeilen, Wörter und Zeichen für jede Datei sind gedruckt, zusammen mit einer Summe für alle Dateien.

Werbung

Wenn wir xarg‘s verwenden  -I (String ersetzen) Option und definieren Sie ein Ersatzzeichenfolgentoken—in ​​diesem Fall ” {}“—das Token wird im letzten Befehl der Reihe nach durch jeden Dateinamen ersetzt. Dies bedeutet, dass wc wiederholt aufgerufen wird, einmal für jede Datei.

find . -name “*.page” -type f -print0 | xargs -0 -I “{}” wc “{}”

Die Ausgabe ist nicht schön aufgereiht. Jeder Aufruf von wc arbeitet mit einer einzelnen Datei, also hat wc nichts, womit die Ausgabe übereinstimmen könnte. Jede Ausgabezeile ist eine unabhängige Textzeile.

Da wc nur dann eine Summe liefern kann, wenn es mit mehreren Dateien gleichzeitig arbeitet, erhalten wir keine zusammenfassenden Statistiken.

Die find -exec Option

Der Befehl find verfügt über eine integrierte Methode zum Aufrufen externer Programme, um eine weitere Verarbeitung der zurückgegebenen Dateinamen durchzuführen. Die Option -exec (execute) hat eine ähnliche Syntax wie der Befehl xargs, unterscheidet sich jedoch von dieser.

find . -name “*.page” -type f -exec wc -c “{}” ;

Dies zählt die Wörter in den übereinstimmenden Dateien. Der Befehl besteht aus diesen Elementen.

  • find .: Startet die Suche im aktuellen Verzeichnis. Der Find-Befehl ist standardmäßig rekursiv, daher werden auch Unterverzeichnisse durchsucht.
  • -name “*.page”: Wir suchen nach Dateien mit Namen, die mit der “*.page” Suchzeichenfolge.
  • -type f: Wir suchen nur nach Dateien, nicht nach Verzeichnissen.
  • -exec wc: Wir werden den wc-Befehl für die Dateinamen ausführen, die mit der Suchzeichenfolge übereinstimmen.
  • -w: Alle Optionen, die Sie an den Befehl übergeben möchten, müssen unmittelbar nach dem Befehl platziert werden.
  • “{}”: Das “{ }” Platzhalter steht für jeden Dateinamen und muss das letzte Element in der Parameterliste sein.
  • ;: Ein Semikolon “;” wird verwendet, um das Ende der Parameterliste anzuzeigen. Es muss mit einem umgekehrten Schrägstrich “” damit die Shell es nicht interpretiert.

Wenn wir diesen Befehl ausführen, sehen wir die Ausgabe von wc. -c (Byteanzahl) begrenzt seine Ausgabe auf die Anzahl der Bytes in jeder Datei.

Werbung

Wie Sie sehen, gibt es keine Gesamtsumme. Der Befehl wc wird einmal pro Dateiname ausgeführt. Durch Ersetzen eines Pluszeichens “+” für das abschließende Semikolon “;” wir können das Verhalten von -exec so ändern, dass alle Dateien gleichzeitig bearbeitet werden.

find . -name “*.page” -type f -exec wc -c “{}” +

< /p>

Wir erhalten die zusammenfassende Gesamtsumme und die sauber tabellarischen Ergebnisse, die uns sagen, dass alle Dateien als eine lange Befehlszeile an WC übergeben wurden.

exec bedeutet wirklich exec

Die Option -exec (execute) startet den Befehl nicht durch Ausführen in der aktuellen Shell. Es verwendet die integrierte Exec von Linux, um den Befehl auszuführen, und ersetzt den aktuellen Prozess —Ihre Shell—durch den Befehl. Der gestartete Befehl läuft also überhaupt nicht in einer Shell. Ohne Shell können Sie keine Shell-Erweiterung von Platzhaltern erhalten und Sie haben keinen Zugriff auf Aliase und Shell-Funktionen.

Auf diesem Computer ist eine Shell-Funktion definiert, die nur Wörter genannt wird. Dies zählt nur die Wörter in einer Datei.

function words-only () {   wc -w $1 } RELATEDSo erstellen Sie Aliase und Shell-Funktionen unter Linux

Eine vielleicht seltsame Funktion, “Nur Wörter” ist viel länger zu tippen als “wc -w” aber zumindest bedeutet dies, dass Sie sich die Befehlszeilenoptionen für WC nicht merken müssen. Wir können das so testen:

words-only user_commands.pages

Das funktioniert gut mit einem normalen Befehlszeilenaufruf. Wenn wir versuchen, diese Funktion mit der Option find‘s -exec aufzurufen, schlägt dies fehl.

finden . -name “*.page” -type f -exec words-only “{}” ;

Werbung

Der find-Befehl kann die Shell nicht finden Funktion und die Aktion -exec schlägt fehl.

Um dies zu umgehen, können wir eine Bash-Shell starten und den Rest der Befehlszeile als Argumente an die Shell übergeben. Wir müssen die Befehlszeile in doppelte Anführungszeichen setzen. Das bedeutet, dass wir die doppelten Anführungszeichen um die “{}” string ersetzen.

Bevor wir den find-Befehl ausführen können, müssen wir unsere Shell-Funktion mit der Option -f (als Funktion) exportieren:

export -f words-only find . -name “*.page” -type f -exec bash -c “nur Wörter “{}”” ;

Dies läuft wie erwartet.

Mehrere Verwendung des Dateinamens

Wenn Sie mehrere Befehle miteinander verketten möchten, können Sie dies tun kann die “{}” String in jedem Befehl ersetzen.

find . -name “*.page” -type f -exec bash -c “basename “{}” && nur Wörter “{}”” ;

Wenn wir eine Stufe aus den “Seiten” Verzeichnis und führen Sie diesen Befehl aus, find wird die PAGE-Dateien trotzdem entdecken, da es rekursiv sucht. Der Dateiname und der Pfad werden wie zuvor an unsere Nur-Wort-Funktion übergeben. Nur um die Verwendung von -exec mit zwei Befehlen zu demonstrieren, rufen wir auch den basename-Befehl auf, um den Namen der Datei ohne ihren Pfad anzuzeigen.

Sowohl den basename-Befehl als auch die Nur-Wort-Shell -Funktion werden die Dateinamen mit einem “{}” Zeichenfolge ersetzen.

Pferde für Kurse

Es gibt eine CPU-Last- und Zeitstrafe für das wiederholte Aufrufen eines Befehls, wenn Sie ihn einmal aufrufen und ihm alle Dateinamen auf einmal übergeben können. Und wenn Sie jedes Mal eine neue Shell aufrufen, um den Befehl zu starten, wird dieser Aufwand noch schlimmer.

Werbung

Aber manchmal—je nachdem, was Sie erreichen möchten& #8212;Sie haben möglicherweise keine andere Option. Welche Methode auch immer Ihre Situation erfordert, es sollte niemanden wundern, dass Linux genügend Optionen bietet, um die für Ihre speziellen Anforderungen passende zu finden.

WEITER LESEN

  • › Erinnerung an VRML: Das Metaverse von 1995
  • › Welche 8K-Inhalte sind tatsächlich verfügbar?
  • › How-To Geek's Best of CES 2022 Award Gewinner: Worüber wir uns freuen
  • › Was bedeutet “NBD” Bedeutet und wie verwende ich es?
  • › Funktionieren Blaulichtbrillen? Alles, was Sie wissen müssen
  • › Nichts Gutes kommt von gedankenlosem Scrollen