Dateien und Befehle in Linux finden

CompTIACompTIABeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einleitung

In diesem Labor werden Sie wesentliche Techniken zum Auffinden von Dateien und Befehlen in der Linux-Kommandozeilenumgebung beherrschen. Sie beginnen mit der Verwendung des leistungsstarken find-Befehls, lernen, wie Sie einfache Suchen nach Namen durchführen und Wildcards für flexiblere Mustererkennung nutzen. Dieser praktische Ansatz führt Sie durch die Erstellung einer Beispielverzeichnisstruktur, um Ihre Suchfähigkeiten sicher zu üben.

Aufbauend auf dieser Grundlage werden Sie untersuchen, wie Sie Befehle auf Ihre Suchergebnisse mit -exec und xargs anwenden. Das Labor behandelt auch alternative und spezialisierte Suchwerkzeuge, einschließlich des schnellen, datenbankgesteuerten locate-Befehls, whereis zum Auffinden von Befehls-Binärdateien und Handbüchern sowie Dienstprogrammen wie alias, which und type zur Analyse des Befehlsausführungspfads. Am Ende werden Sie in der Lage sein, das richtige Werkzeug für jede Datei- oder Befehlssuchaufgabe in Linux auszuwählen.

Grundlegende Dateisuchen mit find und Wildcards durchführen

In diesem Schritt lernen Sie, wie Sie den find-Befehl verwenden, eines der leistungsstärksten Werkzeuge in der Linux-Kommandozeile zum Suchen von Dateien und Verzeichnissen. Wir beginnen mit grundlegenden namensbasierten Suchen und führen Wildcards ein, um Dateimuster zu finden.

Zuerst erstellen wir ein dediziertes Verzeichnis und einige Beispieldateien für unsere Übung. Dies stellt sicher, dass wir eine kontrollierte Umgebung haben, um zu sehen, wie find funktioniert, ohne andere Teile des Dateisystems zu beeinträchtigen.

  1. Stellen Sie sicher, dass Sie sich im korrekten Startverzeichnis befinden. Alle Arbeiten für dieses Labor werden innerhalb von ~/project durchgeführt.
cd ~/project
  1. Erstellen Sie ein neues Verzeichnis namens find_lab und wechseln Sie hinein.
mkdir find_lab
cd find_lab
  1. Erstellen wir nun eine Reihe von Dateien und ein Unterverzeichnis, durch das wir suchen können. Wir verwenden den touch-Befehl zum Erstellen leerer Dateien und mkdir für das Verzeichnis.
touch file1.txt file2.log report.txt File1.TXT
mkdir subdir
touch subdir/file3.txt subdir/another.log

Sie können die Struktur mit dem Befehl ls -R überprüfen, der Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen rekursiv auflistet.

ls -R

Sie sollten eine Ausgabe ähnlich dieser sehen:

.:
File1.TXT  file1.txt  file2.log  report.txt  subdir

./subdir:
another.log  file3.txt

Nachdem unsere Testumgebung nun bereit ist, beginnen wir mit der Suche.

Die grundlegende Syntax für den find-Befehl lautet find [Pfad] [Ausdruck]. Der [Pfad] teilt find mit, wo mit der Suche begonnen werden soll, und der [Ausdruck] definiert, wonach gesucht werden soll.

Suche nach exaktem Dateinamen

Um eine Datei nach ihrem exakten Namen zu finden, verwenden Sie den Ausdruck -name. Suchen wir die Datei report.txt. Wir verwenden . als Pfad, was find anweist, die Suche vom aktuellen Verzeichnis aus zu starten.

find . -name "report.txt"

Die Ausgabe zeigt den Pfad zu der gefundenen Datei:

./report.txt

Suche mit Wildcards

Wildcards ermöglichen es Ihnen, nach Dateien basierend auf Mustern zu suchen. Die gebräuchlichste Wildcard ist der Stern (*), der eine beliebige Zeichenfolge abgleicht.

Es ist eine bewährte Methode, das Muster in doppelte Anführungszeichen (") zu setzen, um zu verhindern, dass die Shell die Wildcard interpretiert, bevor der find-Befehl sie verwenden kann.

Suchen wir alle Dateien, die auf die Erweiterung .txt enden.

find . -name "*.txt"

find durchsucht rekursiv das aktuelle Verzeichnis (.) und alle seine Unterverzeichnisse:

./file1.txt
./report.txt
./subdir/file3.txt

Beachten Sie, dass File1.TXT nicht gefunden wurde, da -name eine Groß-/Kleinschreibung beachtende Suche durchführt. Um eine Groß-/Kleinschreibung ignorierende Suche durchzuführen, verwenden Sie den Ausdruck -iname (insensitive name).

find . -iname "*.txt"

Nun enthält die Ausgabe alle Dateien, die auf .txt enden, unabhängig von der Groß-/Kleinschreibung:

./file1.txt
./report.txt
./File1.TXT
./subdir/file3.txt

Suche nach Dateityp

Sie können find auch anweisen, nur nach bestimmten Arten von Dateisystemobjekten wie Dateien oder Verzeichnissen zu suchen, indem Sie den Ausdruck -type verwenden. Verwenden Sie -type f für reguläre Dateien und -type d für Verzeichnisse.

Suchen wir nur die Verzeichnisse an unserem aktuellen Speicherort.

find . -type d

Die Ausgabe listet das aktuelle Verzeichnis (.) und das von uns erstellte subdir auf:

.
./subdir

Sie können Ausdrücke kombinieren, um spezifischere Suchen zu erstellen. Suchen Sie beispielsweise nach allen Dateien (nicht Verzeichnissen), die auf .log enden:

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

Dieser Befehl findet alle Elemente, die Dateien sind UND deren Name auf .log endet.

./file2.log
./subdir/another.log

Sie haben nun die Grundlagen der Verwendung von find mit Namensmustern und Typfiltern gelernt. In den nächsten Schritten werden wir fortgeschrittenere Fähigkeiten dieses Befehls untersuchen.

Aktionen auf Suchergebnisse mit find -exec und xargs ausführen

In diesem Schritt gehen Sie über das einfache Auflisten von Dateien hinaus. Sie lernen, wie Sie Befehle direkt auf die vom find-Befehl gefundenen Dateien ausführen. Dies ist eine leistungsstarke Technik zur Durchführung von Massenoperationen, wie z. B. zum Ändern von Berechtigungen, zum Löschen von Dateien oder zum Ausführen benutzerdefinierter Skripte. Wir werden zwei Hauptmethoden behandeln: die Option -exec von find und den xargs-Befehl.

Wir arbeiten weiterhin im Verzeichnis ~/project/find_lab aus dem vorherigen Schritt. Stellen Sie zunächst sicher, dass Sie sich im richtigen Verzeichnis befinden.

cd ~/project/find_lab

Verwendung von find -exec

Die Option -exec ermöglicht es Ihnen, einen beliebigen Befehl für jede Datei auszuführen, die find findet. Die Syntax kann anfangs etwas ungewöhnlich erscheinen:

find [Pfad] [Ausdruck] -exec [Befehl] {} \;

  • [Befehl]: Der Befehl, den Sie ausführen möchten (z. B. ls -l, rm, chmod).
  • {}: Dies ist ein spezieller Platzhalter. find ersetzt {} durch den vollständigen Pfad der aktuellen Datei, die es gefunden hat.
  • \;: Dies ist ein erforderlicher Abschluss für den -exec-Befehl. Der Backslash (\) ist notwendig, um zu verhindern, dass die Shell das Semikolon als Sonderzeichen interpretiert.

Versuchen wir es. Wir suchen alle Dateien mit der Erweiterung .txt und führen ls -l für jede einzelne aus, um detaillierte Informationen zu erhalten.

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

Die Ausgabe zeigt das Ergebnis der zweimaligen Ausführung von ls -l, einmal für jede gefundene .txt-Datei:

-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./file1.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./report.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./subdir/file3.txt

Aus Sicherheitsgründen bietet find die Option -ok, die genauso funktioniert wie -exec, aber Sie vor der Ausführung des Befehls für jede Datei zur Bestätigung auffordert. Dies wird dringend empfohlen, wenn destruktive Operationen wie das Löschen von Dateien (rm) durchgeführt werden.

Versuchen wir, die zuvor gelöschten .log-Dateien zu entfernen, diesmal jedoch aus Sicherheitsgründen mit -ok.

find . -name "*.log" -ok rm {} \;

Für jede gefundene Datei fragt find nach Ihrer Bestätigung. Geben Sie y ein und drücken Sie Enter, um die Löschung zu genehmigen.

< rm ... ./file2.log > ? y
< rm ... ./subdir/another.log > ? y

Nach der Bestätigung können Sie durch Auflisten des Inhalts des Verzeichnisses überprüfen, ob die Dateien verschwunden sind.

ls -R
.:
File1.TXT  file1.txt  report.txt  subdir

./subdir:
file3.txt

Verwendung von xargs

Eine Alternative zu -exec ist das Weiterleiten der Ausgabe von find an den xargs-Befehl. xargs liest Elemente aus der Standardeingabe (die von find bereitgestellten Dateipfade) und führt einen angegebenen Befehl mit diesen Elementen als Argumenten aus.

Der Hauptvorteil von xargs ist die Effizienz. Während -exec ... \; den Befehl einmal für jede einzelne Datei ausführt, gruppiert xargs die Dateipfade und führt den Befehl seltener mit vielen Argumenten gleichzeitig aus.

Zuerst erstellen wir die gerade gelöschten Log-Dateien neu, damit wir etwas zum Arbeiten haben.

touch file2.log subdir/another.log

Nun verwenden wir find und xargs, um die Details unserer .log-Dateien aufzulisten.

find . -name "*.log" | xargs ls -l

Die Ausgabe ähnelt dem -exec-Beispiel, aber die Befehlsstruktur ist anders:

-rw-r--r-- 1 labex labex 0 <date> <time> ./file2.log
-rw-r--r-- 1 labex labex 0 <date> <time> ./subdir/another.log

Ähnlich wie find -ok verfügt auch xargs über einen "Prompt"-Modus mit der Option -p. Er zeigt den Befehl an, den er ausführen wird, und bittet um Ihre Bestätigung.

Verwenden wir dies, um die .log-Dateien erneut zu löschen.

find . -name "*.log" | xargs -p rm

xargs gruppiert die Dateien zu einem einzigen rm-Befehl und bittet um Ihre Bestätigung. Geben Sie y ein und drücken Sie Enter.

rm ./file2.log ./subdir/another.log ?...y

Sie haben nun erfolgreich sowohl -exec als auch xargs verwendet, um auf Suchergebnisse zu reagieren, eine grundlegende Fähigkeit zur Automatisierung von Aufgaben in Linux.

locate und updatedb für schnelle datenbankgestützte Suchen verwenden

In diesem Schritt lernen Sie eine Alternative zu find namens locate kennen. Während find das Dateisystem in Echtzeit durchsucht, durchsucht locate eine vordefinierte Datenbank von Dateipfaden. Dies macht locate deutlich schneller, allerdings mit einem entscheidenden Kompromiss: Es kann nur Dateien finden, die existierten, als die Datenbank zuletzt aktualisiert wurde.

Wir werden unsere Arbeit im Verzeichnis ~/project fortsetzen. Zuerst stellen wir sicher, dass die notwendigen Werkzeuge installiert sind.

  1. Der Befehl locate wird vom Paket mlocate bereitgestellt, das möglicherweise nicht standardmäßig installiert ist. Führen Sie den folgenden Befehl aus, um Ihre Paketliste zu aktualisieren und es zu installieren. Sie verwenden sudo, da dies eine systemweite Installation ist.
sudo apt-get update && sudo apt-get install -y mlocate

Sie sehen den Fortschritt der Paketinstallation, was normal ist.

  1. Navigieren wir nun in unser Testverzeichnis aus den vorherigen Schritten.
cd ~/project/find_lab
  1. Versuchen Sie, die Datei report.txt mit locate zu finden.
locate report.txt

Auf vielen Systemen wird die locate-Datenbank automatisch aktualisiert, sodass Sie die Datei möglicherweise sofort sehen:

/home/labex/project/find_lab/report.txt

Wenn Sie den Dateipfad sehen, bedeutet dies, dass die Datenbank bereits Informationen über Ihre kürzlich erstellten Dateien enthält. Dies kann passieren, wenn das System im Hintergrund automatisch Datenbankaktualisierungen durchführt.

  1. Wenn Sie in Schritt 3 keine Ausgabe gesehen haben, muss die Datenbank manuell aktualisiert werden. Verwenden Sie den Befehl updatedb, um die Datenbank neu zu erstellen:
sudo updatedb

Dieser Befehl erzeugt keine Ausgabe, arbeitet aber im Hintergrund. Es kann einige Momente dauern, bis er abgeschlossen ist.

  1. Nachdem Sie updatedb ausgeführt haben (falls erforderlich), versuchen Sie den locate-Befehl erneut:
locate report.txt

Nun sollte er den Pfad zur Datei finden und anzeigen:

/home/labex/project/find_lab/report.txt

Verständnis der Einschränkungen lokaler Datenbanken

Lassen Sie uns untersuchen, was passiert, wenn Sie neue Dateien erstellen, nachdem die Datenbank zuletzt aktualisiert wurde.

  1. Erstellen wir zunächst eine neue Datei in unserem find_lab-Verzeichnis.
touch special_report.pdf
  1. Versuchen Sie, diese neue Datei zu lokalisieren:
locate special_report.pdf

Wenn die Systemdatenbank kürzlich aktualisiert wurde, sehen Sie möglicherweise die Datei. Wenn nicht, gibt es keine Ausgabe, da die Datenbank diese neu erstellte Datei noch nicht kennt.

  1. Sie können eine Aktualisierung der Systemdatenbank erzwingen:
sudo updatedb
  1. Versuchen Sie nun erneut, die Datei zu lokalisieren:
locate special_report.pdf

Sie sollten nun sehen:

/home/labex/project/find_lab/special_report.pdf

Verständnis der Häufigkeit von Datenbankaktualisierungen

Die wichtigste Erkenntnis ist, dass locate von der Aktualität seiner Datenbank abhängt. In Produktionssystemen:

  • Das System aktualisiert die locate-Datenbank normalerweise automatisch (oft täglich über Cron-Jobs).
  • Sie können sie manuell mit sudo updatedb aktualisieren, wenn Sie sofortige Ergebnisse benötigen.
  • locate ist extrem schnell, da es einen vordefinierten Index durchsucht, anstatt das Dateisystem zu scannen.
  • Für das Auffinden sehr neu erstellter Dateien ist find möglicherweise zuverlässiger, da es in Echtzeit sucht.

Sie haben nun gelernt, wie locate durch die Verwendung einer vordefinierten Datenbank blitzschnelle Suchen ermöglicht, und verstehen die Bedeutung der Aktualisierung dieser Datenbank mit updatedb.

Binärdateien und Handbücher mit whereis lokalisieren

In diesem Schritt lernen Sie whereis kennen, einen spezialisierten Befehl zum Auffinden der Binär-, Quell- und Handbuchdateien für einen Befehl. Im Gegensatz zu find oder locate, die für die allgemeine Dateisuche gedacht sind, ist whereis für die schnelle Suche nach den wesentlichen Dateien optimiert, die mit einem Systembefehl verbunden sind. Er funktioniert, indem er eine vordefinierte Liste von Standard-Linux-Verzeichnissen durchsucht, was ihn extrem schnell macht.

Beginnen wir mit der Erkundung des whereis-Befehls. Sie können sich für diesen Schritt in einem beliebigen Verzeichnis befinden, da whereis nicht relativ zu Ihrem aktuellen Standort sucht. Wir bleiben zur Konsistenz im Verzeichnis ~/project.

cd ~/project
  1. Suchen wir die Speicherorte für den passwd-Befehl, der zum Ändern von Benutzerpasswörtern verwendet wird.
whereis passwd

Die Ausgabe zeigt den Befehlsnamen, gefolgt von den Pfaden zu seiner ausführbaren Binärdatei und seinen zugehörigen Handbuchseiten.

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
  • /usr/bin/passwd: Dies ist das ausführbare Programm.
  • /etc/passwd: Dies ist die Benutzerdatenbankdatei des Systems, mit der der passwd-Befehl interagiert. whereis schließt oft wichtige Konfigurationsdateien in seine Ergebnisse ein.
  • /usr/share/man/...: Dies sind die komprimierten Handbuchseiten für den Befehl.
  1. Sie können die Ergebnisse filtern, um nur bestimmte Dateitypen anzuzeigen. Um nur die Binärdateien zu sehen, die mit passwd verknüpft sind, verwenden Sie das Flag -b (binary).
whereis -b passwd

Dies reduziert die Ausgabe auf die ausführbare Datei und zugehörige Dateien, wobei die Manpages ausgeschlossen werden.

passwd: /usr/bin/passwd /etc/passwd
  1. Verwenden Sie ähnlich das Flag -m (manual), um nur die Handbuchseiten zu finden. Dies ist nützlich, wenn Sie wissen möchten, welche Dokumentation für einen Befehl verfügbar ist.
whereis -m passwd

Die Ausgabe listet nun nur die Speicherorte der Manpages auf.

passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
  1. Es ist wichtig, die Einschränkungen von whereis zu verstehen. Es durchsucht nur Standard-Systemverzeichnisse. Versuchen wir, die Datei report.txt zu finden, die wir in unserem find_lab-Verzeichnis erstellt haben.
whereis report.txt

Der Befehl gibt nur den Namen der Datei zurück, aber keinen Pfad:

report.txt:

Dies geschieht, weil sich report.txt in Ihrem Home-Verzeichnis (~/project/find_lab) befindet, was kein Standardverzeichnis für System-Binärdateien oder Manpages ist. Dies verdeutlicht den Hauptunterschied: Verwenden Sie find oder locate für Ihre persönlichen oder Projektdateien und whereis, um Systembefehle zu untersuchen.

Sie haben nun gelernt, wie Sie mit whereis schnell die Dateien lokalisieren können, aus denen ein Linux-Befehl besteht, eine nützliche Fähigkeit für die Systemadministration und Fehlerbehebung.

Befehlspfade mit alias, which und type analysieren

In diesem letzten Schritt erfahren Sie, wie die Shell bestimmt, welcher Befehl ausgeführt wird, wenn Sie seinen Namen eingeben. Dies ist nicht immer so einfach wie das Finden einer Datei auf der Festplatte. Die Shell hat eine bestimmte Reihenfolge der Priorität: Sie prüft zuerst auf Aliase, dann auf Shell-integrierte Befehle und sucht schließlich in den Verzeichnissen der $PATH-Variable des Systems nach einer ausführbaren Datei. Sie lernen, alias zum Erstellen von Befehlskürzeln und which sowie type zum Diagnostizieren, worauf ein Befehlsname tatsächlich verweist, zu verwenden.

Beginnen wir damit, einen temporären Alias zu erstellen, um zu sehen, wie er die Befehlsausführung beeinflusst. Wir bleiben im Verzeichnis ~/project.

  1. Ein Alias ist ein benutzerdefiniertes Kürzel für einen anderen Befehl. Erstellen wir einen Alias, der den Befehl pwd (print working directory) dazu veranlasst, stattdessen den Befehl date auszuführen.
alias pwd='date'
  1. Führen Sie nun den Befehl pwd aus.
pwd

Anstatt Ihr aktuelles Verzeichnis anzuzeigen, gibt er das aktuelle Datum und die Uhrzeit aus, da der Alias Vorrang hat.

<current date and time>

Untersuchung mit which und type

Stellen Sie sich nun vor, Sie wüssten nichts von dem Alias. Wie würden Sie diagnostizieren, warum pwd sich falsch verhält? Hier sind which und type nützlich.

  1. Der Befehl which sucht eine ausführbare Datei in den Verzeichnissen, die in der Umgebungsvariablen $PATH aufgeführt sind.
which pwd

Die Ausgabe zeigt:

pwd: aliased to date
  1. Der Befehl type ist umfassender. Es handelt sich um einen Shell-integrierten Befehl, der beschreibt, wie die Shell einen Befehlsnamen interpretiert, einschließlich Aliase und integrierter Funktionen.
type pwd

Dieser Befehl identifiziert die Situation korrekt:

pwd is an alias for date
  1. Um alle möglichen Befehle anzuzeigen, die einem Namen entsprechen, können Sie das Flag -a (all) verwenden. Dies ist besonders mächtig mit type.
type -a pwd

Dies enthüllt die vollständige Hierarchie für den Befehlsnamen pwd:

pwd is an alias for date
pwd is a shell builtin
pwd is /usr/bin/pwd
pwd is /bin/pwd

Diese Ausgabe zeigt die Reihenfolge der Präferenz der Shell: Sie wird zuerst den Alias verwenden. Wenn der Alias nicht existieren würde, würde sie den integrierten pwd-Befehl der Shell verwenden. Wenn keines von beiden existieren würde, würde sie das Programm ausführen, das sich unter /usr/bin/pwd befindet.

Entfernen eines Alias

Zum Schluss räumen wir unser Experiment auf, indem wir den Alias entfernen.

  1. Der Befehl unalias entfernt eine Alias-Definition aus der aktuellen Shell-Sitzung.
unalias pwd
  1. Führen Sie nun pwd und type pwd erneut aus, um zu bestätigen, dass alles wieder normal ist.
pwd

Ausgabe:

/home/labex/project
type pwd

Ausgabe:

pwd is a shell builtin

Sie haben nun gelernt, wie man Aliase erstellt und entfernt und, was noch wichtiger ist, wie man mit which und type genau versteht, welchen Befehl die Shell ausführen wird.

Zusammenfassung

In diesem Lab haben Sie gelernt, Dateien und Verzeichnisse im Linux-Dateisystem zu durchsuchen. Sie begannen mit dem leistungsstarken find-Befehl, verwendeten namensbasierte Kriterien und Wildcards für grundlegende Suchen und gingen dann zur Ausführung von Befehlen auf den Suchergebnissen mit -exec und xargs über. Sie haben auch den locate-Befehl als schnellere, datenbankgesteuerte Alternative erkundet und gelernt, wie Sie seine Datenbank mit updatedb pflegen.

Darüber hinaus behandelte das Lab Techniken zur Lokalisierung und Analyse von Befehlen. Sie verwendeten whereis, um den Speicherort von Befehls-Binärdateien und deren Handbuchseiten zu finden. Um den Befehlsausführungspfad zu verstehen, lernten Sie, which zu verwenden, um die spezifische aufgerufene ausführbare Datei zu identifizieren, und type, um festzustellen, ob ein Befehl ein Alias, ein integrierter Befehl oder eine Datei ist, und analysierten gleichzeitig, wie Aliase das Befehlsverhalten beeinflussen.