Tutorial

Verwenden von Find und Locate zur Suche nach Dateien unter Linux

Published on January 5, 2021
Deutsch
Verwenden von Find und Locate zur Suche nach Dateien unter Linux

Einführung

Ein Problem, auf das Benutzer stoßen, wenn sie zum ersten Mal mit einem Linux-Rechner arbeiten, ist die Frage, wie Sie die gesuchten Dateien finden können.

Dieser Leitfaden behandelt die Verwendung des treffend benannten Befehls find Dies hilft Ihnen bei der Suche nach Dateien auf Ihrem VPS unter Verwendung einer Vielzahl von Filtern und Parametern. Wir werden auch kurz auf den Befehl locate eingehen, mit dem Sie auf andere Weise nach Dateien suchen können.

Suchen nach Name

Die offensichtlichste Möglichkeit der Suche nach Dateien ist nach Name.

Um eine Datei anhand ihres Namens zu finden, geben Sie Folgendes ein:

  1. find -name "query"

Dabei wird die Groß- und Kleinschreibung beachtet, d. h. eine Suche nach file unterscheidet sich von einer Suche nach File.

Um eine Datei nach dem Namen zu suchen, aber die Groß-/Kleinschreibung der Abfrage zu ignorieren, geben Sie Folgendes ein:

  1. find -iname "query"

Wenn Sie alle Dateien finden möchten, die sich nicht an ein bestimmtes Muster halten, können Sie die Suche mit -not oder ! umkehren. Wenn Sie ! verwenden, müssen Sie das Zeichen Maskieren, damit die Bash nicht versucht, es zu interpretieren, bevor „find“ agieren kann:

  1. find -not -name "query_to_avoid"

Oder

  1. find \! -name "query_to_avoid"

Suchen nach Typ

Sie können den Typ der Dateien angeben, die Sie mit dem Parameter -type finden möchten. Es funktioniert wie folgt:

  1. find -type type_descriptor query

Einige der gebräuchlichsten Deskriptoren, die Sie zur Angabe des Dateityps verwenden können, sind:

  • f: reguläre Datei

  • d: Verzeichnis

  • l: symbolischer Link

  • c: Zeichengeräte

  • b: Blockgeräte

Wenn wir beispielsweise alle Zeichengeräte in unserem System finden möchten, könnten wir diesen Befehl ausgeben:

  1. find / -type c
Output
/dev/parport0 /dev/snd/seq /dev/snd/timer /dev/autofs /dev/cpu/microcode /dev/vcsa7 /dev/vcs7 /dev/vcsa6 /dev/vcs6 /dev/vcsa5 /dev/vcs5 /dev/vcsa4 . . .

Wir können nach allen Dateien suchen, die in .conf enden:

  1. find / -type f -name "*.conf"
Output
/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf /usr/share/base-files/nsswitch.conf /usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf /usr/share/rsyslog/50-default.conf /usr/share/adduser/adduser.conf /usr/share/davfs2/davfs2.conf /usr/share/debconf/debconf.conf /usr/share/doc/apt-utils/examples/apt-ftparchive.conf . . .

Filtern nach Zeit und Größe

„Find“ bietet Ihnen eine Vielzahl von Möglichkeiten, um Ergebnisse nach Größe und Zeit zu filtern.

Größe

Sie können mit dem Parameter -size nach Größe filtern.

Wir fügen ein Suffix am Ende unseres Wertes hinzu, das angibt, wie wir zählen. Dies sind einige beliebte Optionen:

  • c: Bytes

  • k: Kilobytes

  • M: Megabytes

  • G: Gigabytes

  • b: 512-Byte-Blöcke

Um alle Dateien zu finden, die genau 50 Bytes groß sind, geben Sie Folgendes ein:

  1. find / -size 50c

Um alle Dateien zu finden, die kleiner als 50 Bytes sind, können wir stattdessen diese Form verwenden:

  1. find / -size -50c

Um alle Dateien zu finden, die größer als 700 Megabytes sind, können wir diesen Befehl verwenden:

  1. find / -size +700M

Zeit

Linux speichert Zeitdaten über Zugriffszeiten, Modifizierungszeiten und Änderungszeiten.

  • Zugriffszeit: Letzter Zeitpunkt, in dem eine Datei gelesen oder geschrieben wurde.

  • Modifizierungszeit: Letzter Zeitpunkt, an dem der Inhalt der Datei modifiziert wurde.

  • Änderungszeit: Letzter Zeitpunkt, an dem die Inode-Metadaten der Datei geändert wurden.

Wir können diese mit den Parametern -atime, -mtime und -ctime verwenden. Diese können die Plus- und Minus-Symbole verwenden, um größer als oder kleiner als anzugeben, wie wir es bei der Größe getan haben.

Der Wert dieses Parameters gibt an, wie viele zurückliegende Tage Sie suchen möchten.

Um Dateien zu finden, die eine Modifizierungszeit von vor einem Tag haben, geben Sie Folgendes ein:

  1. find / -mtime 1

Wenn wir Dateien möchten, auf die vor weniger als einem Tag zugegriffen wurden, können wir Folgendes eingeben:

  1. find / -atime -1

Um Dateien zu erhalten, deren letzte Änderung der Metadaten mehr als 3 Tage zurückliegt, geben Sie Folgendes ein:

  1. find / -ctime +3

Es gibt auch einige Begleitparameter, mir denen wir Minuten anstelle von Tagen angeben können:

  1. find / -mmin -1

Dadurch werden die Dateien angegeben, die in der letzten Minute im System modifiziert wurden.

„Find“ kann auch Vergleiche gegen eine Referenzdatei durchführen und diejenigen zurückgeben, die neuer sind:

  1. find / -newer myfile

Suchen nach Eigentümern und Berechtigungen

Sie können auch nach Dateien anhand des Dateieigentümers oder des Gruppeneigentümers suchen.

Dazu verwenden Sie die Parameter -user bzw. -group. Suchen Sie eine Datei, deren Eigentümer der Benutzer „syslog“ ist, indem Sie Folgendes eingeben:

  1. find / -user syslog

Ähnlich können wir Dateien angeben, deren Eigentümer die Gruppe „shadow“ ist, indem wir Folgendes eingeben:

  1. find / -group shadow

Wir können auch nach Dateien mit bestimmten Berechtigungen suchen.

Wenn wir einen genauen Satz von Berechtigungen abgleichen möchten, verwenden wir diese Form:

  1. find / -perm 644

Dies gleicht Dateien mit genau den angegebenen Berechtigungen ab.

Wenn wir etwas mit zumindest diesen Berechtigungen angeben möchten, können Sie diese Form verwenden:

  1. find / -perm -644

Dies gleicht alle Dateien ab, die zusätzliche Berechtigungen aufweisen. Eine Datei mit der Berechtigung „744“ würde in diesem Fall gefunden werden.

Filtern nach Tiefe

Für diesen Abschnitt erstellen wir eine Verzeichnisstruktur in einem temporären Verzeichnis. Es enthält drei Verzeichnisebenen, mit zehn Verzeichnissen auf der ersten Ebene. Jedes Verzeichnis (einschließlich des temporären Verzeichnisses) enthält zehn Dateien und zehn Unterverzeichnisse.

Erstellen Sie diese Struktur durch Ausgabe der folgenden Befehle:

  1. cd
  2. mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
  3. touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
  4. cd ~/test

Sie können sich die Verzeichnisstrukturen mit ls und cd ansehen, um einen Überblick über die Organisation zu erhalten. Wenn Sie fertig sind, kehren Sie in das Testverzeichnis zurück:

  1. cd ~/test

Wir werden uns damit beschäftigen, wie bestimmte Dateien aus dieser Struktur zurückgegeben werden. Versuchen wir zunächst ein Beispiel mit einer regulären Namenssuche, zum Vergleich:

  1. find -name file1
Output
./level1dir7/level2dir8/level3dir9/file1 ./level1dir7/level2dir8/level3dir3/file1 ./level1dir7/level2dir8/level3dir4/file1 ./level1dir7/level2dir8/level3dir1/file1 ./level1dir7/level2dir8/level3dir8/file1 ./level1dir7/level2dir8/level3dir7/file1 ./level1dir7/level2dir8/level3dir2/file1 ./level1dir7/level2dir8/level3dir6/file1 ./level1dir7/level2dir8/level3dir5/file1 ./level1dir7/level2dir8/file1 . . .

Es gibt eine Menge Ergebnisse. Wenn wir die Ausgabe in einen Zähler leiten, können wir sehen, dass es insgesamt 1111 Ergebnisse gibt:

  1. find -name file1 | wc -l
Output
1111

Das sind wahrscheinlich zu viele Ergebnisse, um für Sie in den meisten Fällen nützlich zu sein. Versuchen wir, dies einzugrenzen.

Sie können die maximale Tiefe der Suche unter dem Suchverzeichnis auf höchster Ebene festlegen:

  1. find -maxdepth num -name query

Um „file1“ nur in den Verzeichnissen „level1“ und höher zu finden, können Sie eine maximale Tiefe von 2 (1 für das Verzeichnis auf höchster Ebene und 1 für die Verzeichnisse level1) festlegen:

  1. find -maxdepth 2 -name file1
Output
./level1dir7/file1 ./level1dir1/file1 ./level1dir3/file1 ./level1dir8/file1 ./level1dir6/file1 ./file1 ./level1dir2/file1 ./level1dir9/file1 ./level1dir4/file1 ./level1dir5/file1 ./level1dir10/file1

Das ist eine wesentlich besser verwaltbare Liste.

Sie können auch ein Mindestverzeichnis angeben, wenn Sie wissen, dass alle Dateien ab einem bestimmten Punkt unter dem aktuellen Verzeichnis bestehen:

  1. find -mindepth num -name query

Wir können dies verwenden, um nur die Dateien am Ende der Verzeichniszweige zu finden:

  1. find -mindepth 4 -name file
Output
./level1dir7/level2dir8/level3dir9/file1 ./level1dir7/level2dir8/level3dir3/file1 ./level1dir7/level2dir8/level3dir4/file1 ./level1dir7/level2dir8/level3dir1/file1 ./level1dir7/level2dir8/level3dir8/file1 ./level1dir7/level2dir8/level3dir7/file1 ./level1dir7/level2dir8/level3dir2/file1 . . .

Wiederum wird dies aufgrund unserer verzweigten Verzeichnisstruktur eine große Anzahl von Ergebnissen (1000) zurückgegeben.

Sie können die Parameter Min- und Max-Tiefe kombinieren, um sich auf einen engen Bereich zu konzentrieren:

  1. find -mindepth 2 -maxdepth 3 -name file
Output
./level1dir7/level2dir8/file1 ./level1dir7/level2dir5/file1 ./level1dir7/level2dir7/file1 ./level1dir7/level2dir2/file1 ./level1dir7/level2dir10/file1 ./level1dir7/level2dir6/file1 ./level1dir7/level2dir3/file1 ./level1dir7/level2dir4/file1 ./level1dir7/file1 . . .

Ausführen und Kombinieren von „Find“-Befehlen

Sie können einen beliebigen Hilfsbefehl auf alles, was „find“ findet, ausführen, indem Sie den Parameter -exec verwenden. Dieser wird wie folgt aufgerufen:

  1. find find_parameters -exec command_and_params {} \;

Die {} werden als Platzhalter für die Dateien verwendet, die „find“ findet. Das \; wird verwendet, damit „find“ weiß, wo der Befehl endet.

Wir könnten beispielsweise die Dateien im vorherigen Abschnitt finden, die 644 Berechtigungen aufwiesen, und sie so ändern, dass sie 664 Berechtigungen aufweisen:

  1. cd ~/test
  2. find . -type f -perm 644 -exec chmod 664 {} \;

Wir könnten dann die Verzeichnisberechtigungen wie folgt ändern:

  1. find . -type d -perm 755 -exec chmod 700 {} \;

Wenn Sie verschiedene Ergebnisse miteinander verketten möchten, können Sie die Befehle -and oder -or verwenden. Das -and wird angenommen, wenn es weggelassen wird.

  1. find . -name file1 -or -name file9

Suchen von Dateien unter Verwendung von „locate“

Eine Alternative zur Verwendung von find, ist der Befehl locate. Dieser Befehl ist oft schneller und kann das gesamte Dateisystem mit Leichtigkeit durchsuchen.

Sie können den Befehl unter Debian oder Ubuntu mit apt installieren:

  1. sudo apt install mlocate

Unter CentOS verwenden Sie stattdessen dnf:

  1. sudo dnf install mlocate

Der Grund, warum locate schneller ist als find, ist, dass er sich auf eine Datenbank der Dateien im Dateisystem verlässt.

Die Datenbank wird normalerweise einmal täglich mit einem Cron-Skript aktualisiert, aber Sie können sie manuell aktualisieren, indem Sie Folgendes eingeben:

  1. sudo updatedb

Führen Sie diesen Befehl nun aus. Denken Sie daran, dass die Datenbank immer aktuell sein muss, wenn Sie kürzlich erworbene oder erstellte Dateien finden möchten.

Um Dateien mit „locate“ zu finden, verwenden Sie einfach diese Syntax:

  1. locate query

Sie können die Ausgabe auf einige Arten filtern.

Um beispielsweise nur Dateien zurückzugeben, die die Abfrage selbst enthalten, anstatt jede Datei zurückzugeben, die die Abfrage in den Verzeichnissen aufweist, die zu ihr führen, können Sie das -b verwenden, um nur den „Basisnamen“ zu suchen:

  1. locate -b query

Wenn „locate“ nur Ergebnisse zurückgeben soll, die noch im Dateisystem vorhanden sind (die nicht zwischen dem letzten Aufruf von updatedb und dem aktuellen Aufruf von locate entfernt wurden), verwenden Sie das Flag -e:

  1. locate -e query

Um eine Statistik über die Informationen anzuzeigen, die „locate“ katalogisiert hat, verwenden Sie die Option -S:

  1. locate -S
Output
Database /var/lib/mlocate/mlocate.db: 3,315 directories 37,228 files 1,504,439 bytes in file names 594,851 bytes used to store database

Zusammenfassung

Sowohl „find“ als auch „locate“ sind gute Methoden, um Dateien auf einem System zu finden. Es ist Ihnen überlassen zu entscheiden, welches dieser Tools in der jeweiligen Situation angemessen ist.

„Find“ und „locate“ sind leistungsfähige Befehle, die durch die Kombination mit anderen Dienstprogrammen über noch verstärkt werden können. Experimentieren Sie mit der Filterung durch Verwendung von Befehlen wie wc, sort und grep.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel