GNU/Linux >> LINUX-Kenntnisse >  >> Linux

15 super nützliche Beispiele für den Find-Befehl in Linux

Der find-Befehl dient zum Suchen nach Dateien und Verzeichnissen in der Linux-Kommandozeile.

Find ist einer der mächtigsten und am häufigsten verwendeten Befehle. Es ist auch einer der umfangreichsten Befehle mit über 50 Optionen und das macht es etwas verwirrend, besonders wenn es mit dem exec- oder xargs-Befehl gepaart wird.

Es ist für einen Systemadministrator oder Softwareentwickler unmöglich, den find-Befehl zu vermeiden, während er in der Befehlszeile arbeitet. Anstatt Angst davor zu haben, solltest du seine Macht annehmen.

Ich werde einige der häufigsten Beispiele für den find-Befehl diskutieren, die Sie wahrscheinlich verwenden werden. Aber vorher zeige ich Ihnen seine Syntax und wie man sie benutzt.

Suchbefehl in Linux

Die allgemeine Syntax für den Suchbefehl lautet:

find [directory to search] [options] [expression]

Alles in Klammern [] ist optional. Das bedeutet, dass Sie find ausführen können Befehl ohne Optionen und Argumente. Es werden einfach alle Dateien und Verzeichnisse am aktuellen Speicherort abgelegt. Das ist nicht sehr nützlich, oder?

Sehen wir uns das genauer an:

  • directory to search ist im Grunde der Ort, an dem Sie Ihre Suche starten möchten. Standardmäßig ist die Suche rekursiv und beginnt an Ihrem aktuellen Standort.
  • options Geben Sie die Art der Suche an, sei es nach Name, nach Typ, nach Änderungszeit usw. Hier sind mehr als 50 Optionen möglich.
  • expression erlaubt Ihnen, den Suchbegriff zu spezifizieren. Wenn Sie eine Datei nach ihrem Namen suchen möchten, ist Ausdruck der Dateiname. Wenn Sie Dateien finden möchten, deren Name einem Muster entspricht, Ausdruck im Muster.

Lassen Sie mich ein einfaches Beispiel nehmen:

find . -type f -name myfile

Dieser Befehl führt eine Suche im aktuellen Verzeichnis und seinen Unterverzeichnissen durch, um eine Datei (nicht Verzeichnis) mit dem Namen myfile zu finden . Die Option -type f fordert es auf, nur nach Dateien zu suchen. Der einzelne Punkt . bedeutet das aktuelle Verzeichnis.

Sehen wir uns einige praktische Beispiele für den find-Befehl an.

Dateien und Verzeichnisse nach Namen suchen

Sie können Dateien und Verzeichnisse anhand ihres Namens suchen:

find . -name SEARCH_NAME

Da kein Dateityp angegeben ist, sucht es sowohl nach Dateien als auch nach Verzeichnissen mit dem angegebenen Namen.

Das folgende Beispiel findet sowohl Dateien als auch Verzeichnisse mit dem Namen mystuff:

[email protected]:~/Examples$ find -name mystuff
./new/mystuff
./mystuff

Finde nur Dateien oder nur Verzeichnisse

Wenn Sie nur nach Dateien suchen möchten, geben Sie den Dateityp -f:

an
find . -type f -name SEARCH_NAME

Die Reihenfolge von Typ und Name spielt keine Rolle. Nehmen Sie das vorherige Beispiel und suchen Sie nur nach Dateien:

[email protected]:~/Examples$ find -type f -name mystuff
./mystuff

Wenn Sie nur nach Verzeichnissen suchen möchten, geben Sie type -d:

an
find . -type d -name SEARCH_NAME

Suchen Sie in der vorherigen Datei nur nach Verzeichnissen:

[email protected]:~/Examples$ find -type d -name mystuff
./new/mystuff

Standardmäßig wird beim Find-Befehl zwischen Groß- und Kleinschreibung unterschieden. Sie können eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung mit dem angegebenen Namen ausführen, indem Sie -iname verwenden statt -name .

find . -type f -iname SEARCH_NAME

Sie können es mit type d verwenden auch.

[email protected]:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff

Screenshot der obigen drei Beispiele:

Dateien anhand ihrer Erweiterung suchen (wichtig)

Eine der häufigsten Anwendungen des Find-Befehls ist das Suchen von Dateien eines bestimmten Typs oder sollte ich sagen, einer bestimmten Erweiterung.

Angenommen, Sie möchten nach allen C++-Dateien in den aktuellen Verzeichnissen suchen. Die C++-Dateien enden mit der Erweiterung .cpp, Sie können also folgendermaßen suchen:

find . -type f -name "*.cpp"

Auf diese Weise weisen Sie den find-Befehl an, nach type file zu suchen und mit Namen, die auf .cpp enden .

[email protected]:~$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp
Setzen Sie Ihren Suchausdruck immer in doppelte Anführungszeichen, wenn Sie den Befehl find verwenden.

Warum empfehle ich, Ihren Suchbegriff in doppelte oder einfache Anführungszeichen zu setzen? Denn wenn Sie das nicht tun, erweitert die Shell den Platzhalter.

Wenn Sie Ihren Suchbegriff nicht in Anführungszeichen setzen:

find . -type f -name *.cpp

Ihre Shell wird *.cpp erweitern und durch alle Dateien im aktuellen Verzeichnis ersetzen, deren Namen auf .cpp enden.

Dies könnte funktionieren, wenn es nur eine Datei gibt, aber wenn es mehr als eine gibt, wird sich Ihre Shell über eine falsche Syntax beschweren.

Im obigen Beispiel gibt es nur eine cpp-Datei und daher wird der Befehl zu find . -type f -name file.cpp , es funktioniert, weil es file.cpp ist funktioniert immer noch als Suchbegriff.

Aber es gibt zwei .txt-Dateien im selben Verzeichnis und daher, wenn der Befehl zu find . -type f -name another.txt new.txt , es beschwert sich, weil es jetzt mehr als einen Suchbegriff gibt.

Aus diesem Grund sollten Sie Ihren Suchbegriff immer in doppelte Anführungszeichen setzen.

Suche nach mehreren Dateien mit mehreren Erweiterungen (oder Bedingungen)

Der obige Befehl hat nach Dateien mit einer bestimmten Erweiterung gesucht. Was ist, wenn Sie nach Dateien mit unterschiedlichen Erweiterungen suchen möchten?

Anstatt den find-Befehl mehrmals auszuführen, führen Sie ihn einmal mit -o aus Option, die als logische ODER-Bedingung funktioniert:

find . -type f -name "*.cpp" -o -name "*.txt" 

Hier ist ein Beispiel:

[email protected]:~/Examples$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt

Nach Dateien in einem bestimmten Verzeichnis suchen

Bisher haben alle Beispiele eine Suche im aktuellen Verzeichnis durchgeführt, weil Sie angegeben haben. in den Beispielen.

Der Punkt kann durch einen absoluten oder relativen Pfad eines Verzeichnisses ersetzt werden, sodass Sie im angegebenen Verzeichnis nach Dateien suchen können, ohne Ihren aktuellen Standort zu verlassen.

[email protected]:~/Examples$ find ./new -name mystuff 
./new/mystuff

Nach Dateien in mehreren Verzeichnissen suchen

Wenn Sie glauben, dass sich Ihre gewünschten Dateien an mehreren Orten befinden könnten, müssen Sie den Befehl find nicht mehrmals ausführen. Geben Sie einfach alle zu durchsuchenden Verzeichnispfade im Befehl find an:

find ./location1 /second/location -type f -name "pattern"

Leere Dateien und Verzeichnisse finden

Die -empty Option ermöglicht es Ihnen, mit dem find-Befehl nach leeren Dateien und Verzeichnissen zu suchen.

Um alle leeren Dateien und Verzeichnisse im aktuellen Verzeichnis zu finden, verwenden Sie:

find . -empty

Sie können den Dateityp angeben, um nur nach leeren Dateien oder Verzeichnissen zu suchen:

find . -empty -type f

Sie können es auch mit der Dateinamensuche kombinieren:

find . -empty -type f -name "*.cpp"

Finde große oder kleine Dateien (Suche basierend auf Dateigröße)

Sie können große oder kleine Dateien basierend auf der Suche finden, die vom Größenparameter durchgeführt wird. Dies funktioniert nur mit Dateien, nicht mit Verzeichnissen.

Sie verwenden die -size Option mit +N für Größe größer als N und -N für Größe kleiner als N.

Suchen Sie Dateien mit einer Größe von genau 50 KB:

find . -size 50k

So suchen Sie im aktuellen Verzeichnis nach Dateien, die größer als 1 GB sind:

find . -size +1G

So finden Sie weniger als 20 Bytes:

find . -size -20c

So finden Sie Dateien, die größer als 100 MB, aber kleiner als 2 GB sind:

find . -size +100M -size -2G

Sie können die Größensuche auch mit der Namenssuche kombinieren. Um beispielsweise nach allen Dateien zu suchen, deren Name auf .log endet, aber größer als 500 MB im Stammverzeichnis ist, können Sie Folgendes verwenden:

find / -size +500M -name "*.log"

Zur Erinnerung:

  • c :Bytes
  • k :Kilobyte
  • M :Megabyte
  • G :Gigabyte

Finde kürzlich geänderte Dateien (Suche basierend auf Änderungs- oder Erstellungszeit)

Sie kennen das Konzept von mtime, atime und ctime, richtig?

  • mtime:Zeit der letzten Änderung der Datei
  • ctime:Erstellungszeit der Datei
  • atime:Zeitpunkt des letzten Zugriffs auf die Datei

Sie werden sich oft in Situationen wiederfinden, in denen Sie alle kürzlich geänderten Dateien finden möchten. In solchen Fällen hilft die Suche nach geänderter Zeit.

Um alle Dateien zu finden, die innerhalb von 3 Tagen (3*24H) geändert wurden, verwenden Sie:

find . -type f -mtime -3

Um alle Dateien zu finden, die vor mindestens 5 Tagen (5*24H) erstellt wurden, verwenden Sie:

find . -type f -ctime +5

Ich weiß, dass 24 Stunden ein riesiger Zeitrahmen sind. Was ist, wenn Sie nach Dateien suchen möchten, die erst vor wenigen Minuten geändert wurden? Dafür können Sie mmin verwenden , amin und cmin .

Um alle Dateien zu finden, die in den letzten 5 Minuten geändert wurden, verwenden Sie:

find . -type f -mmin -5

Sie können Ober- und Untergrenzen zusammen mit dem Suchnamen angeben. Der folgende Befehl sucht nach allen .java-Dateien, die in den letzten 20 bis 30 Minuten geändert wurden.

find . -type f -mmin +20 -mmin -30 -name "*.java"

Dateien mit bestimmten Dateiberechtigungen finden

Ich hoffe, Sie sind mit dem Dateiberechtigungskonzept in Linux vertraut.

Mit dem Befehl find können Sie nach Dateien mit bestimmten Dateiberechtigungen und Zugriffsmodi suchen.

find -perm mode

Zum Beispiel, um alle Dateien im Zugriffsmodus 777 im aktuellen Verzeichnis zu finden;

find . -perm 777

So finden Sie alle Dateien mit Lese- und Schreibzugriff für alle (exakte Übereinstimmung, keine Übereinstimmung, wenn die Datei Ausführungsberechtigung für alle hat):

find . -perm a=r+w

Suchen Sie Dateien, die einem Benutzer gehören

Sie können auch anhand des Eigentums nach Dateien suchen.

Um beispielsweise Dateien zu finden, die dem Benutzer John im aktuellen Verzeichnis gehören, verwenden Sie:

find . -type f -user John

Sie können es auch mit anderen Optionen wie Größe, Zeit und Name kombinieren:

find . -type f -user John -name "*.cpp"

Nicht rekursiv suchen, nur im aktuellen Verzeichnis suchen

Standardmäßig sucht der Befehl find in allen Unterverzeichnissen Ihres aktuellen Standorts. Wenn Sie das nicht möchten, können Sie die Suchtiefe auf 1 festlegen. Dadurch wird die Suche auf das aktuelle Verzeichnis beschränkt und alle Unterverzeichnisse ausgeschlossen.

find . -maxdepth 1 -type f -name "*.txt"

Wenn Sie ein Verzeichnis von der Suche ausschließen möchten, können Sie dies tun, indem Sie path, prune und logical or.

kombinieren
find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME

Seien Sie vorsichtig mit dem * im Pfad des Verzeichnisses, -prune nach path und -o nach dem Beschneiden.

Grundsätzlich fordert der Prune-Befehl dazu auf, den durch den Pfad angegebenen Wert nicht zu verwenden. Prune wird immer mit -o verwendet um sicherzustellen, dass die rechte Seite der Begriffe nur für Verzeichnisse ausgewertet wird, die nicht bereinigt wurden.

Aktionen auf das Ergebnis von Suchbefehlen (exec und xargs) ausführen

Bisher haben Sie verschiedene Möglichkeiten kennengelernt, Dateien anhand verschiedener Kriterien zu finden. Das ist gut. Sie können es jedoch verbessern, indem Sie bestimmte Aktionen auf das Ergebnis des Find-Befehls anwenden.

Wie wäre es zum Beispiel, Dateien zu finden, die einem bestimmten Namensmuster entsprechen, und sie alle auf einmal umzubenennen oder leere Dateien zu finden und sie zu löschen?

Sie wissen, dass die Pipe-Umleitung verwendet werden kann, um die Ausgabe eines Befehls mit der Eingabe eines anderen Befehls zu kombinieren. Aber das funktioniert nicht mit der Ausgabe des find-Befehls, zumindest nicht direkt.

Sie haben zwei Möglichkeiten, wenn Sie eine Aktion auf das Ergebnis des Find-Befehls ausführen möchten:

  • Verwenden Sie exec
  • Xargs verwenden

Suchen und Ausführen verwenden

Angenommen, Sie möchten die Suchdateien mit dem Befehl find in eine lange Liste aufnehmen (ls -l). Folgendes verwenden Sie:

find . -type f -name "*.txt" -exec ls -l {} +

Hier ist die Ausgabe:

[email protected]:~/Examples$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt

Viele Leute vergessen, den {} + hinzuzufügen am Ende des exec-Befehls. Sie müssen es verwenden und auf das Leerzeichen zwischen {} und + achten.

Das {} verweist auf das Ergebnis des Find-Befehls. Sie können sich das so vorstellen:{Datei 1, Datei 2, Datei 3}. Das + sign wird verwendet, um den exec-Befehl zu beenden.

Es gibt auch eine andere Konvention mit exec:

find . -type f -name *.txt" -exec ls -l {} \;

Hier,; wird anstelle des + Zeichens verwendet. Das zusätzliche \ vor; wird verwendet, um das Sonderzeichen;.

zu maskieren

Der Vorteil von {} + ist, dass weniger Befehle ausgeführt werden als ls -l file1 file2 file3 wohingegen {} \; wird ls -l file1 ausführen , ls -l file2 usw.

Aber {} \; hat den Vorteil, {} zu verwenden mehr als einmal in derselben exec-Anweisung. Beispielsweise benennt der folgende Befehl alle gefundenen Dateien mit der Erweiterung .old um.

find . -type f -name *.txt" -exec mv {} {}.old \;

Xargs verwenden

Viele Linux-Benutzer gewöhnen sich an die Pipe-Umleitung. Dieser exec-Befehl mit dem nachgestellten {} + wirkt auf sie einschüchternd.

Hier hilft xargs. Sie parsen einfach die Ausgabe des find-Befehls zum xargs-Befehl per Pipe.

find . -type f -name *.txt" | xargs ls -l

Die Syntax scheint viel einfacher zu sein, oder? Der Xargs-Befehl ist ebenfalls sehr leistungsfähig. Sie können darüber hier lesen.

Kombination von find und grep

Jetzt, da Sie wissen, wie man find mit xargs und dem exec-Befehl kombiniert, können Sie es verwenden, um find und grep zu kombinieren.

Für jeden Systemadministrator oder Softwareentwickler ist find und grep eine der gebräuchlichsten und dennoch nützlichsten Kombinationen.

Sie suchen mit find nach Dateinamenmustern und verwenden dann grep, um nach dem Inhalt dieser Dateien zu suchen.

Sie möchten beispielsweise nach allen .txt-Dateien suchen, die den Begriff Alice enthalten. Sie kombinieren find und grep wie folgt:

find . -type f -name "*.txt" -exec grep -i alice {} +

Dasselbe kann auch mit xargs erreicht werden:

find . -type f -name "*.txt" | xargs grep -i alice

Dies ist natürlich das einfachste der Beispiele, aber wenn Sie mit dem grep-Befehl vertraut sind, können Sie ihn nach Belieben und Bedarf verwenden.

Es gibt noch viel mehr mit find ...

Und es ist nicht möglich, alle Find-Befehlsoptionen und Beispiele aufzulisten. Die Möglichkeiten sind endlos, aber wenn Sie sich mit dem Find-Befehl vertraut gemacht haben, können Sie ihn in einer Vielzahl von Situationen verwenden. Es liegt wirklich an Ihnen, wie Sie die Logik hier kombinieren.

Ich hoffe, Sie finden diese Beispiele für den find-Befehl nützlich. Wenn Sie noch Fragen oder Verbesserungsvorschläge zu diesem Artikel haben, lassen Sie es mich bitte im Kommentarbereich wissen.


Linux
  1. 12 nützliche Wget-Befehlsbeispiele unter Linux

  2. 25 Nützliche praktische Beispiele für find-Befehle unter Linux

  3. Verwenden des Linux-Suchbefehls – Verwendung mit Beispielen

  4. So verwenden Sie den id-Befehl unter Linux:5 nützliche Beispiele

  5. Finden Sie Befehlsbeispiele in Linux

SS-Befehl in Linux mit nützlichen Beispielen

11 Nützliche Beispiele für Linux-Datumsbefehle

50 einfache und nützliche Beispiele für den Find-Befehl in Linux

10 Nützliche Beispiele für den Sort-Befehl in Linux

Wesentliche Beispiele des ps-Befehls in Linux

12 Nützliche Beispiele für Linux-Datumsbefehle