Ich möchte herausfinden, wo sich eine Datei (mit einem teilweise bekannten Dateinamen) im Dateisystem befindet. Ich möchte wissen, wie dies über die Befehlszeile erfolgt, anstatt ein GUI-Dienstprogramm zu verwenden.
Unter Windows würde ich Folgendes ausführen:
cd /d C:\
dir *filename* /s
Was ist das Linux-Äquivalent?
ls
?Antworten:
(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 vonls
, 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 .
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 übereinfoo/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 werdenshopt -s globstar
(Sie können diese Zeile in Ihre Zeile einfügen~/.bashrc
).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 festgelegtshopt -s nullglob
haben. In diesem Fall wird das Muster zu einer leeren Liste erweitert), und zsh signalisiert einen Fehler (sofern Sie nicht festgelegt habensetopt nullglob
, odersetopt 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 anzeigenls -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:-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 KurzformEin 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 vonlocate
overfind /
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 Basisprogrammlocate
indiziert nur öffentlich lesbare Dateien (möglicherweise möchten Sie den Begleiter ausführenupdatedb
, um eine zweite Datenbank zu erstellen, die alle Dateien in Ihrem Konto indiziert); Es gibt andere Versionen (mlocate, slocate), die alle Dateien indizieren und daslocate
Programm die Datenbank filtern lassen, um nur die Dateien zurückzugeben, die Sie sehen können.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 .quelle
Das Äquivalent zu Ihrem DOS-Beispiel wäre:
Unter Linux brauchen Sie das
-print
Argument jedoch im Allgemeinen nicht mehr. Wenn Sie mit anderen Betriebssystemen arbeiten, kann es hilfreich sein, dies zu wissen.quelle
Wenn Sie etwas "schnelles" wollen , aber nicht in einer geschäftskritischen Situation und nur wissen möchten, ob es existiert und wo es sich befindet, können Sie es verwenden
locate
. Es speichert eine Datenbank aller Dateien in Verzeichnissen, zu denen Sie Informationen gesammelt haben.Richtet in der Standardinstallation (unter Ubuntu)
locate
einen täglichencron
Job ein, der das Dateisystem scannt und die Datenbank aktualisiert ...Wenn Sie der Meinung sind, dass Sie die Datenbank vor dem nächsten Cron-Update auf den neuesten Stand bringen müssen, ist sie in der Regel schneller als
find
oderls
nur zum Ausführensudo updatedb
und dannlocate
. Es ist definitiv schneller, wenn Sie mehr suchen müssen ... wie der Name schon sagt,updatedb
aktualisiert die Datenbank, dielocate
...locate
hat eingebauten regulären Ausdruck, was es sehr praktisch macht ... Ich werde esfind
in einem Skript verwenden, aber ich verwende es seltenfind
in der Kommandozeile. Ich benutze sogarlocate
in (persönlichen) Skripten ... zB.locate -bir "oo.*datt.*mp4$"
locate
Gibt die vollständig qualifizierten Pfade übereinstimmender Dateien zurück.quelle
Wenn ich beispielsweise im Verzeichnis / home nach einem Dateinamen suchen möchte, der foo enthält, würde ich den folgenden Befehl verwenden:
Verwenden Sie den Befehl,
man find
um weitere Informationen zum Befehl find und zu den Argumenten zu erhalten.quelle
*
s zitieren oder maskieren , um zu verhindern, dass die Shell sie interpretiert.