locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*
(Lesen Sie weiter für die wichtigsten Geschäftsbedingungen. Lesen Sie das Handbuch für das Kleingedruckte.)
Das Auflisten des Inhalts eines Verzeichnisses ist eine Art sekundäres Merkmal von ls
. Die Hauptaufgabe von ls
, die den größten Teil ihrer Komplexität in Anspruch nimmt, ist die Feinabstimmung der Anzeige. (Sehen Sie sich das Handbuch an und vergleichen Sie die Anzahl der Optionen für die Auswahl der anzuzeigenden Dateien mit der Anzahl der Optionen, die steuern, welche Informationen zu den einzelnen Dateien angezeigt werden sollen und wie die Anzeige formatiert ist. Dies gilt für beide GNUs, die Sie verwenden. ll auf Linux finden, und von anderen Systemen mit weniger Optionen, da den frühen Tagen.)
Der Standardmodus von ls
ist, dass beim Übergeben eines Verzeichnisses die Dateien in diesem Verzeichnis aufgelistet werden. Wenn Sie einen anderen Dateityp übergeben (reguläre Datei, symbolischer Link usw.), wird nur diese Datei aufgelistet. (Dies gilt für jedes Argument separat.) Die Option -d
weist an, ls
niemals in ein Verzeichnis abzusteigen.
ls
hat eine Option -R
, die es anweist, Verzeichnisse rekursiv aufzulisten. Es ist jedoch nur begrenzt anwendbar und lässt nicht viel Filterung für die Ausgabe zu.
Das allererste Werkzeug, das einen Mustervergleich durchführt, ist die Shell selbst. Sie brauchen keinen anderen Befehl: Geben Sie einfach Ihre Platzhalter ein und schon sind Sie fertig. Dies wird als Globbing bezeichnet .
echo *filename*
Traditionell waren Platzhalter auf das aktuelle Verzeichnis (oder das angegebene Verzeichnis :) beschränkt echo /some/where/*filename*
. A *
stimmt mit einem beliebigen Dateinamen oder einem beliebigen Teil des Dateinamens *.txt
überein, stimmt jedoch nicht überein foo/bar.txt
. Moderne Shells haben das Muster hinzugefügt, **/
was "in diesem Verzeichnis oder in einem beliebigen Verzeichnis darunter (rekursiv)" bedeutet. Mit bash muss diese Funktion aus Gründen der historischen Kompatibilität explizit aktiviert werden shopt -s globstar
(Sie können diese Zeile in Ihre Zeile einfügen ~/.bashrc
).
echo **/*filename*
Der echo
Befehl gibt nur die Liste der Dateinamen wieder, die von der Shell generiert wurden. Wenn ausnahmsweise überhaupt kein übereinstimmender Dateiname vorhanden ist, bleibt das Platzhaltermuster in bash unverändert (sofern Sie es nicht festgelegt shopt -s nullglob
haben. In diesem Fall wird das Muster zu einer leeren Liste erweitert), und zsh signalisiert einen Fehler (sofern Sie nicht festgelegt haben setopt nullglob
, oder setopt no_no_match
wodurch das Muster unverändert bleibt).
Möglicherweise möchten Sie noch ls
für seine Optionen verwenden. ls
Kann beispielsweise durch Farben Hinweise auf die Art oder die Berechtigungen der Datei (Verzeichnis, ausführbare Datei usw.) geben. Möglicherweise möchten Sie das Datum, die Größe und den Besitz der Datei mit anzeigen ls -l
. Weitere Optionen finden Sie im Handbuch.
Der traditionelle Befehl zum Suchen nach einer Datei in einem Verzeichnisbaum lautet find
. Es gibt viele Optionen, um zu steuern, welche Dateien angezeigt werden sollen und was damit zu tun ist. So suchen Sie beispielsweise nach Dateien, deren Name mit dem Muster *filename*
im aktuellen Verzeichnis und seinen Unterverzeichnissen übereinstimmt, und drucken ihre Namen aus:
find /some/dir -name '*filename*' -print
-print
ist eine Aktion (die meisten anderen Aktionen bestehen aus der Ausführung eines Befehls für die Datei); Wenn Sie keine Aktion -print
ausführen , ist dies impliziert. Wenn Sie kein Verzeichnis angeben, das durchlaufen werden soll (siehe /some/dir
oben), wird das aktuelle Verzeichnis impliziert. Die Bedingung -name '*filename'
besagt, dass nur die Dateien aufgelistet (oder bearbeitet) werden sollen, deren Name mit diesem Muster übereinstimmt. Es gibt viele andere Filter, z. B. -mtime -1
um die in den letzten 24 Stunden geänderten Dateien abzugleichen. Sie können die Anführungszeichen manchmal weglassen -name '*filename*'
, aber nur, wenn der Platzhalter keiner Datei im aktuellen Verzeichnis entspricht (siehe oben). Alles in allem ist die Kurzform
find -name '*filename*'
Ein weiteres nützliches Werkzeug, wenn Sie (einen Teil) des Namens einer Datei kennen, ist locate
. Dieses Tool fragt eine Datenbank mit Dateinamen ab. Auf typischen Systemen wird es jede Nacht aktualisiert. Der Vorteil von locate
over find /
ist, dass es viel schneller ist. Ein Nachteil ist, dass seine Informationen veraltet sein können. Es gibt mehrere Implementierungen, locate
die sich in ihrem Verhalten auf Mehrbenutzersystemen unterscheiden: Das Basisprogramm locate
indiziert nur öffentlich lesbare Dateien (möglicherweise möchten Sie den Begleiter ausführen updatedb
, um eine zweite Datenbank zu erstellen, die alle Dateien in Ihrem Konto indiziert); Es gibt andere Versionen (mlocate, slocate), die alle Dateien indizieren und das locate
Programm die Datenbank filtern lassen, um nur die Dateien zurückzugeben, die Sie sehen können.
locate filename
Manchmal denken Sie, dass eine Datei von einem Paket in Ihrer Distribution bereitgestellt wird, Sie kennen (einen Teil davon) den Namen der Datei, aber nicht den Namen Ihres Pakets, und Sie möchten das Paket installieren. Viele Distributionen bieten dafür ein Werkzeug. Unter Ubuntu ist es das apt-file search filename
. Überprüfen Sie den Pacman Rosetta auf gleichwertige Befehle auf anderen Systemen .
ls
?