Dateien und Befehle in Linux finden

CompTIABeginner
Jetzt üben

Einführung

In diesem Lab werden Sie die wesentlichen Techniken zum Auffinden von Dateien und Befehlen innerhalb der Linux-Kommandozeile erlernen. Sie beginnen mit dem mächtigen find-Befehl und lernen, wie Sie einfache Suchen nach Namen durchführen und Platzhalter für flexiblere Suchmuster nutzen. Dieser praxisorientierte Ansatz führt Sie durch die Erstellung einer Beispiel-Verzeichnisstruktur, um Ihre Suchfähigkeiten sicher zu trainieren.

Auf dieser Grundlage aufbauend werden Sie untersuchen, wie Sie Befehle direkt auf Ihre Suchergebnisse anwenden können, indem Sie -exec und xargs verwenden. Das Lab deckt auch alternative und spezialisierte Suchwerkzeuge ab, darunter den schnellen, datenbankgestützten locate-Befehl, whereis zum Finden von Programmdateien und Handbüchern sowie Dienstprogramme wie alias, which und type, um den Ausführungspfad von Befehlen zu analysieren. Am Ende werden Sie in der Lage sein, für jede Suchaufgabe in Linux das richtige Werkzeug auszuwählen.

Grundlegende Dateisuche mit find und Platzhaltern durchführen

In diesem Schritt lernen Sie den Umgang mit dem find-Befehl, einem der leistungsfähigsten Werkzeuge der Linux-Kommandozeile zum Suchen von Dateien und Verzeichnissen. Wir beginnen mit einfachen namensbasierten Suchen und führen Platzhalter ein, um Dateimuster zu finden.

Zuerst erstellen wir ein spezielles Verzeichnis und einige Beispieldateien für unsere Übung. Dies stellt sicher, dass wir eine kontrollierte Umgebung haben, um die Funktionsweise von find zu sehen, ohne andere Teile des Dateisystems zu beeinflussen.

  1. Stellen Sie sicher, dass Sie sich im richtigen Startverzeichnis befinden. Alle Arbeiten für dieses Lab 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, das wir durchsuchen können. Wir verwenden den Befehl touch, um leere Dateien zu erstellen, 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

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

Die grundlegende Syntax für den find-Befehl lautet find [Pfad] [Ausdruck]. Der [Pfad] gibt an, wo find mit der Suche beginnen soll, und der [Ausdruck] definiert, wonach gesucht wird.

Suche nach exaktem Dateinamen

Um eine Datei anhand ihres exakten Namens zu finden, verwenden Sie den Ausdruck -name. Suchen wir nach der Datei report.txt. Wir verwenden . als Pfad, was find anweist, im aktuellen Verzeichnis zu suchen.

find . -name "report.txt"

Die Ausgabe zeigt den Pfad zur gefundenen Datei:

./report.txt

Suche mit Platzhaltern

Platzhalter (Wildcards) ermöglichen es Ihnen, nach Dateien basierend auf Mustern zu suchen. Der gebräuchlichste Platzhalter ist das Sternchen (*), das für eine beliebige Zeichenfolge steht.

Es ist ratsam, das Muster in doppelte Anführungszeichen (") zu setzen, um zu verhindern, dass die Shell den Platzhalter interpretiert, bevor der find-Befehl ihn verarbeiten kann.

Suchen wir nach allen Dateien, die auf .txt enden.

find . -name "*.txt"

find sucht rekursiv im aktuellen Verzeichnis (.) und allen Unterverzeichnissen:

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

Beachten Sie, dass File1.TXT nicht gefunden wurde, da -name eine Suche unter Berücksichtigung der Groß- und Kleinschreibung durchführt. Um eine Suche unabhängig von der Groß-/Kleinschreibung 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 Schreibweise:

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

Suche nach Dateityp

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

Suchen wir nur nach den Verzeichnissen an unserem aktuellen Standort.

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. Um beispielsweise alle Dateien (keine Verzeichnisse) zu finden, 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 Funktionen dieses Befehls untersuchen.

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

In diesem Schritt gehen wir über das bloße Auflisten von Dateien hinaus. Sie lernen, wie Sie Befehle direkt auf die vom find-Befehl gefundenen Dateien anwenden. Dies ist eine leistungsstarke Technik für Massenoperationen, wie das Ändern von Berechtigungen, das Löschen von Dateien oder das Ausführen eigener Skripte. Wir behandeln zwei primäre Methoden: die Option -exec von find und den Befehl xargs.

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

cd ~/project/find_lab

Verwendung von find -exec

Die Option -exec erlaubt es Ihnen, einen beliebigen Befehl für jede Datei auszuführen, die find lokalisiert. Die Syntax kann anfangs etwas ungewohnt 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 aktuell gefundenen Datei.
  • \;: Dies ist ein erforderliches Abschlusszeichen für den -exec-Befehl. Der Backslash (\) ist notwendig, um zu verhindern, dass die Shell das Semikolon als Sonderzeichen interpretiert.

Probieren wir es aus. Wir suchen alle Dateien mit der Endung .txt und führen für jede ls -l aus, um detaillierte Informationen zu sehen.

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

Die Ausgabe zeigt das Ergebnis von ls -l, das für jede gefundene .txt-Datei einzeln ausgeführt wurde:

-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

Zur Sicherheit bietet find die Option -ok, die genau wie -exec funktioniert, Sie aber vor der Ausführung des Befehls bei jeder Datei um Bestätigung bittet. Dies wird dringend empfohlen, wenn Sie destruktive Operationen wie das Löschen von Dateien (rm) durchführen.

Versuchen wir, die zuvor erstellten .log-Dateien zu entfernen, diesmal jedoch mit -ok zur Sicherheit.

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

Für jede gefundene Datei fragt find nach Ihrer Bestätigung. Geben Sie y ein und drücken Sie die Eingabetaste, um das Löschen zu bestätigen.

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

Nach der Bestätigung können Sie durch Auflisten des Verzeichnisinhalts überprüfen, ob die Dateien gelöscht wurden.

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

./subdir:
file3.txt

Verwendung von xargs

Eine Alternative zu -exec besteht darin, die Ausgabe von find per Pipe an den Befehl xargs zu übergeben. xargs liest Elemente von der Standardeingabe (die von find gelieferten Dateipfade) und führt einen angegebenen Befehl mit diesen Elementen als Argumente aus.

Der Hauptvorteil von xargs ist die Effizienz. Während -exec ... \; den Befehl für jede einzelne Datei einmal 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 wieder Arbeitsmaterial 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 <Datum> <Zeit> ./file2.log
-rw-r--r-- 1 labex labex 0 <Datum> <Zeit> ./subdir/another.log

Wie find -ok verfügt auch xargs über einen "Bestätigungsmodus" mit der Option -p. Er zeigt den Befehl an, der ausgeführt werden soll, und bittet um Ihre Zustimmung.

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

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

xargs gruppiert die Dateien in einen einzigen rm-Befehl und bittet um Bestätigung. Geben Sie y ein und drücken Sie die Eingabetaste.

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

Sie haben nun erfolgreich sowohl -exec als auch xargs eingesetzt, um auf Suchergebnisse zu reagieren – eine grundlegende Fertigkeit 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 vorab erstellte Datenbank mit Dateipfaden. Dies macht locate erheblich schneller, bringt jedoch einen entscheidenden Nachteil mit sich: Es kann nur Dateien finden, die zum Zeitpunkt der letzten Datenbankaktualisierung bereits existierten.

Wir setzen unsere Arbeit im Verzeichnis ~/project fort. Stellen Sie zunächst sicher, dass die erforderlichen Werkzeuge installiert sind.

  1. Der Befehl locate wird durch das 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 werden den Fortschritt der Paketinstallation sehen, 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

In 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 automatische Datenbank-Updates im Hintergrund ausführt.

  1. Falls Sie in Schritt 3 keine Ausgabe erhalten haben, muss die Datenbank manuell aktualisiert werden. Verwenden Sie den Befehl updatedb, um die Datenbank neu aufzubauen:
sudo updatedb

Dieser Befehl erzeugt keine Ausgabe, arbeitet aber im Hintergrund. Es kann einen Moment 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

Einschränkungen der lokalen Datenbank verstehen

Untersuchen wir, was passiert, wenn Sie neue Dateien erstellen, nachdem die Datenbank zuletzt aktualisiert wurde.

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

Wenn die Systemdatenbank erst vor kurzem aktualisiert wurde, sehen Sie die Datei vielleicht. Wenn nicht, erfolgt keine Ausgabe, da die Datenbank von dieser neu erstellten Datei noch nichts weiß.

  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 Folgendes sehen:

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

Verständnis der Aktualisierungshäufigkeit

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

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

Sie haben nun gelernt, wie locate durch die Verwendung einer Datenbank blitzschnelle Suchen ermöglicht, und verstehen, wie wichtig es ist, diese Datenbank mit updatedb aktuell zu halten.

Befehlsdateien und Handbücher mit whereis lokalisieren

In diesem Schritt lernen Sie den Befehl whereis kennen, ein spezialisiertes Werkzeug zum Auffinden der Binärdatei, des Quellcodes und der Handbuchseiten (Manpages) eines Befehls. Im Gegensatz zu find oder locate, die für die allgemeine Dateisuche gedacht sind, ist whereis darauf optimiert, schnell die wesentlichen Dateien zu finden, die mit einem Systembefehl verknüpft sind. Es durchsucht eine vordefinierte Liste von Standard-Linux-Verzeichnissen, was es extrem schnell macht.

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

cd ~/project
  1. Suchen wir nach den Speicherorten für den Befehl passwd, 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 den 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 Benutzerdatenbank des Systems, mit der der Befehl passwd interagiert. whereis listet oft wichtige Konfigurationsdateien in seinen Ergebnissen auf.
  • /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 mit passwd verknüpften Binärdateien zu sehen, verwenden Sie das Flag -b (binary).
whereis -b passwd

Dies schränkt die Ausgabe auf die ausführbare Datei und verwandte Dateien ein und schließt die Manpages aus.

passwd: /usr/bin/passwd /etc/passwd
  1. Um nur die Handbuchseiten zu finden, verwenden Sie entsprechend das Flag -m (manual). 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 noch 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 Grenzen von whereis zu verstehen. Es durchsucht nur Standard-Systemverzeichnisse. Versuchen wir, die Datei report.txt zu finden, die wir in unserem Verzeichnis find_lab 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 Standardort 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 whereis verwenden, um schnell die Dateien zu lokalisieren, 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 untersuchen wir, wie die Shell bestimmt, welcher Befehl ausgeführt werden soll, wenn Sie seinen Namen eingeben. Das ist nicht immer so einfach wie das Finden einer Datei auf der Festplatte. Die Shell hat eine bestimmte Rangfolge: Sie prüft zuerst auf Aliase, dann auf Shell-interne Befehle (Built-ins) und durchsucht schließlich die Verzeichnisse in der Systemvariable $PATH nach einer ausführbaren Datei. Sie lernen, wie Sie mit alias Befehlskürzel erstellen und mit which und type diagnostizieren, worauf ein Befehlsname tatsächlich verweist.

Beginnen wir mit der Erstellung eines temporären Alias, 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 bewirkt, dass der Befehl pwd (print working directory) stattdessen den Befehl date ausführt.
alias pwd='date'
  1. Führen Sie nun den Befehl pwd aus.
pwd

Anstatt Ihr aktuelles Verzeichnis auszugeben, wird das aktuelle Datum und die Uhrzeit angezeigt, da der Alias Vorrang hat.

<aktuelles Datum und Uhrzeit>

Untersuchung mit which und type

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

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

Die Ausgabe zeigt:

pwd: aliased to date
  1. Der Befehl type ist umfassender. Es ist ein Shell-interner Befehl, der beschreibt, wie die Shell einen Befehlsnamen interpretieren wird, einschließlich Aliasen und internen Funktionen.
type pwd

Dieser Befehl identifiziert die Situation korrekt:

pwd is an alias for date
  1. Um alle möglichen Befehle zu sehen, die auf einen Namen passen, können Sie das Flag -a (all) verwenden. Dies ist besonders in Kombination mit type sehr aussagekräftig.
type -a pwd

Dies offenbart die gesamte 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 verrät Ihnen die Rangfolge der Shell: Sie wird zuerst den Alias verwenden. Wenn der Alias nicht existieren würde, würde sie den Shell-internen pwd-Befehl verwenden. Wenn keiner von beiden existieren würde, würde sie das Programm unter /usr/bin/pwd ausführen.

Einen Alias entfernen

Räumen wir zum Abschluss 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 Sie Aliase erstellen und entfernen und, was noch wichtiger ist, wie Sie which und type verwenden, um genau zu verstehen, welchen Befehl die Shell ausführen wird.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie nach Dateien und Verzeichnissen im gesamten Linux-Dateisystem suchen. Sie begannen mit dem mächtigen find-Befehl, nutzten namensbasierte Kriterien und Platzhalter für einfache Suchen und gingen dann dazu über, Befehle mit -exec und xargs direkt auf die Suchergebnisse anzuwenden. Sie haben auch den locate-Befehl als schnellere, datenbankgestützte Alternative kennengelernt und erfahren, wie Sie dessen Datenbank mit updatedb aktuell halten.

Darüber hinaus behandelte das Lab Techniken zum Lokalisieren und Analysieren von Befehlen. Sie verwendeten whereis, um den Speicherort von Programmbereichen und deren Handbuchseiten zu finden. Um den Ausführungspfad von Befehlen zu verstehen, lernten Sie which einzusetzen, um die spezifische aufgerufene ausführbare Datei zu identifizieren, und type, um festzustellen, ob ein Befehl ein Alias, ein Built-in oder eine Datei ist, während Sie gleichzeitig analysierten, wie Aliase das Befehlsverhalten beeinflussen.