Einführung
Ein Problem, auf das Benutzer stoßen, wenn sie zum ersten Mal mit einem Linux-Rechner zu tun haben, ist die Frage, wie sie die gesuchten Dateien finden können.
Dieser Leitfaden beschreibt, wie man den treffend benannten Befehl find
verwendet. Dieser hilft Ihnen bei der Suche nach Dateien auf Ihrem VPS mit 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.
Nach Namen suchen
Die naheliegendste Möglichkeit, nach Dateien zu suchen, ist die Suche nach dem Namen.
Um eine Datei nach dem Namen zu suchen, geben Sie ein:
- find -name "query"
Dabei wird zwischen Groß- und Kleinschreibung unterschieden, was bedeutet, dass eine Suche nach file
anders ist als eine Suche nach File
.
Um eine Datei nach ihrem Namen zu suchen, aber die Groß- und Kleinschreibung zu ignorieren, geben Sie ein:
- find -iname "query"
Wenn Sie alle Dateien finden wollen, die nicht einem bestimmten Muster entsprechen, können Sie die Suche mit -not
oder !
umkehren. Wenn Sie !
verwenden, müssen Sie das Zeichen escapen, damit die Bash nicht versucht, es zu interpretieren, bevor find agieren kann:
- find -not -name "query_to_avoid"
Oder
- find \! -name "query_to_avoid"
Finden nach Typ
Sie können den Typ der Dateien, die Sie finden wollen, mit dem Parameter -type
angeben. Er funktioniert folgendermaßen:
- find -type type_descriptor query
Einige der gebräuchlichsten Deskriptoren, die Sie zur Angabe des Dateityps verwenden können, sind hier aufgeführt:
-
f: Reguläre Datei
-
d: Verzeichnis
-
l: Symbolischer Link
-
c: Zeichengeräte
-
b: Blockgeräte
Wenn wir zum Beispiel alle Zeichengeräte auf unserem System finden wollten, könnten wir diesen Befehl eingeben:
- 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 auf .conf
enden, wie folgt:
- 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 verschiedene Möglichkeiten, die Ergebnisse nach Größe und Zeit zu filtern.
Größe
Mit dem Parameter -size
können Sie 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 ein:
- find / -size 50c
Um alle Dateien zu finden, die weniger als 50 Bytes groß sind, können wir stattdessen diese Form verwenden:
- find / -size -50c
Um alle Dateien mit mehr als 700 Megabyte zu finden, können wir diesen Befehl verwenden:
- find / -size +700M
Zeit
Linux speichert Zeitdaten über Zugriffszeiten, Modifikationszeiten und Änderungszeiten.
-
Zugriffszeit: Letzter Zeitpunkt, an dem eine Datei gelesen oder beschrieben wurde.
-
Änderungszeit: Letztes Mal, als der Inhalt der Datei geändert 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 oder kleiner als anzugeben, wie wir es bei size getan haben.
Der Wert dieses Parameters gibt an, vor wie vielen Tagen Sie suchen möchten.
Um Dateien zu finden, deren Änderungszeit einen Tag zurückliegt, geben Sie Folgendes ein:
- find / -mtime 1
Wenn Sie Dateien suchen, auf die vor weniger als einem Tag zugegriffen wurde, können Sie Folgendes eingeben:
- find / -atime -1
Um Dateien zu finden, deren letzte Änderung der Metadaten mehr als drei Tage zurückliegt, geben Sie Folgendes ein:
- find / -ctime +3
Es gibt auch einige zusätzliche Parameter, die wir verwenden können, um Minuten anstelle von Tagen anzugeben:
- find / -mmin -1
Damit werden die Dateien angezeigt, die in der letzten Minute geändert wurden, indem das System eingegeben wird.
Die Suche kann auch Vergleiche mit einer Referenzdatei anstellen und diejenigen zurückgeben, die neuer sind:
- find / -newer myfile
Suche nach Eigentümer und Berechtigungen
Sie können auch nach dem Eigentümer der Datei oder dem Eigentümer der Gruppe suchen.
Sie tun dies, indem Sie die Parameter -user
bzw. -group
verwenden. Suchen Sie eine Datei, die dem Benutzer „syslog“ gehört, indem Sie Folgendes eingeben:
- find / -user syslog
Auch Dateien, die der Gruppe „shadow“ gehören, können Sie angeben, indem Sie Folgendes eingeben:
- find / -group shadow
Wir können auch nach Dateien mit bestimmten Berechtigungen suchen.
Wenn wir einen exakten Satz von Berechtigungen abgleichen wollen, verwenden wir diese Form:
- find / -perm 644
Dies wird Dateien mit genau den angegebenen Berechtigungen abgleichen.
Wenn wir alles mit mindestens diesen Berechtigungen angeben wollen, können Sie diese Form verwenden:
- find / -perm -644
Dies wird alle Dateien abgleichen, die zusätzliche Berechtigungen haben. Eine Datei mit der Berechtigung „744“ würde in diesem Fall gefunden werden.
Filtern nach Tiefe
Für diesen Abschnitt werden wir eine Verzeichnisstruktur in einem temporären Verzeichnis erstellen. Sie wird drei Verzeichnisebenen enthalten, mit zehn Verzeichnissen auf der ersten Ebene. Jedes Verzeichnis (einschließlich des temporären Verzeichnisses) wird zehn Dateien und zehn Unterverzeichnisse enthalten.
Erstellen Sie diese Struktur mit den folgenden Befehlen:
- cd
- mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
- touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
- 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 zum Testverzeichnis zurück:
- cd ~/test
Wir werden uns damit befassen, wie man bestimmte Dateien aus dieser Struktur zurückgeben kann. Versuchen wir zunächst zum Vergleich ein Beispiel mit einer normalen Namenssuche:
- 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, sehen wir, dass es insgesamt 1111 Ergebnisse gibt:
- find -name file1 | wc -l
Output1111
Das sind wahrscheinlich zu viele Ergebnisse, um für Sie in den meisten Fällen nützlich zu sein. Versuchen wir, es einzugrenzen:
Sie können die maximale Tiefe der Suche unter dem obersten Suchverzeichnis angeben:
- find -maxdepth num -name query
Um „file1“ nur in den Verzeichnissen der „Ebene 1“ und darüber zu finden, können Sie eine maximale Tiefe von 2 angeben (1 für das oberste Verzeichnis und 1 für die Verzeichnisse der Ebene 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 viel überschaubarere Liste.
Sie können auch ein Mindestverzeichnis angeben, wenn Sie wissen, dass alle Dateien nach einem bestimmten Punkt unter dem aktuellen Verzeichnis existieren:
- find -mindepth num -name query
Wir können dies verwenden, um nur die Dateien am Ende der Verzeichnisverzweigungen zu finden:
- 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. . .
Auch dies wird aufgrund unserer verzweigten Verzeichnisstruktur eine große Anzahl von Ergebnissen (1000) liefern.
Sie können die Parameter min und max depth kombinieren, um sich auf einen engen Bereich zu konzentrieren:
- 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 Suchbefehlen
Mit dem Parameter -exec
können Sie einen beliebigen Hilfsbefehl für alle Suchergebnisse ausführen. Dieser wird wie folgt aufgerufen:
- find find_parameters -exec command_and_params {} \;
Das {}
wird als Platzhalter für die Dateien verwendet, die gefunden werden. Das \;
wird verwendet, damit find weiß, wo der Befehl endet.
Zum Beispiel könnten wir die Dateien im vorherigen Abschnitt finden, die 644
Berechtigungen hatten, und sie so ändern, dass sie 664
Berechtigungen haben:
- cd ~/test
- find . -type f -perm 644 -exec chmod 664 {} \;
Wir könnten dann die Verzeichnisberechtigungen wie folgt ändern:
- find . -type d -perm 755 -exec chmod 700 {} \;
Wenn Sie verschiedene Ergebnisse aneinanderreihen möchten, können Sie die Befehle -and
oder -or
verwenden. Das -and
wird angenommen, wenn es weggelassen wird.
- find . -name file1 -or -name file9
Dateien mit Locate suchen
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:
- sudo apt install mlocate
Unter CentOS verwenden Sie stattdessen dnf
:
- sudo dnf install mlocate
Der Grund, warum locate
schneller als find
ist, ist, dass es sich auf eine Datenbank der Dateien im Dateisystem verlässt.
Die Datenbank wird normalerweise einmal am Tag mit einem Cron-Skript aktualisiert, aber Sie können sie auch manuell aktualisieren, indem Sie Folgendes eingeben:
- sudo updatedb
Führen Sie diesen Befehl jetzt aus. Denken Sie daran, dass die Datenbank immer auf dem neuesten Stand sein muss, wenn Sie kürzlich erworbene oder erstellte Dateien finden wollen.
Um Dateien mit locate zu finden, verwenden Sie einfach diese Syntax:
- locate query
Sie können die Ausgabe auf verschiedene Weise filtern.
Um zum Beispiel nur Dateien zurückzugeben, die die Abfrage selbst enthalten, anstatt jede Datei zurückzugeben, die die Abfrage in den Verzeichnissen hat, die zu ihr führen, können Sie das -b
verwenden, um nur den „basename“ zu durchsuchen:
- locate -b query
Um locate nur Ergebnisse zurückgeben zu lassen, die noch im Dateisystem existieren (die nicht zwischen dem letzten updatedb
-Aufruf und dem aktuellen locate
-Aufruf entfernt wurden), verwenden Sie das -e
-Flag:
- locate -e query
Um Statistiken über die Informationen zu sehen, die locate katalogisiert hat, verwenden Sie die Option -S
:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
Fazit
Beide, find und locate, sind gute Methoden, um Dateien auf Ihrem System zu finden. Es liegt an Ihnen, zu entscheiden, welches dieser Werkzeuge in jeder Situation geeignet ist.
Find und locate sind mächtige Befehle, die durch die Kombination mit anderen Dienstprogrammen über Pipelines verstärkt werden können. Experimentieren Sie mit der Filterung, indem Sie Befehle wie wc
, sort
und grep
verwenden.