Wie finde ich eine Datei im Dateisystem über die Befehlszeile?

10

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?

Iszi
quelle
Nun, es gibt ganz offensichtlich mehr als einen Weg, diese Katze zu häuten . Ich bin immer noch ein bisschen neugierig zu wissen, ob es einen Weg gibt, es zu tun ls?
Iszi

Antworten:

13
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 lsist, 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 -dweist an, lsniemals in ein Verzeichnis abzusteigen.

lshat 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 echoBefehl 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 nullglobhaben. 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_matchwodurch das Muster unverändert bleibt).

Möglicherweise möchten Sie noch lsfür seine Optionen verwenden. lsKann 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

-printist eine Aktion (die meisten anderen Aktionen bestehen aus der Ausführung eines Befehls für die Datei); Wenn Sie keine Aktion -printausführen , ist dies impliziert. Wenn Sie kein Verzeichnis angeben, das durchlaufen werden soll (siehe /some/diroben), 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 -1um 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 locateover find /ist, dass es viel schneller ist. Ein Nachteil ist, dass seine Informationen veraltet sein können. Es gibt mehrere Implementierungen, locatedie sich in ihrem Verhalten auf Mehrbenutzersystemen unterscheiden: Das Basisprogramm locateindiziert 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 locateProgramm 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 .

Gilles 'SO - hör auf böse zu sein'
quelle
Ich wünschte, ich könnte dies erneut abstimmen. Ich musste heute Abend nur nach einem anderen Projekt suchen. Nochmals vielen Dank, @ Gilles!
Iszi
6

Das Äquivalent zu Ihrem DOS-Beispiel wäre:

cd /
find . -name \*filename\* -print

Unter Linux brauchen Sie das -printArgument jedoch im Allgemeinen nicht mehr. Wenn Sie mit anderen Betriebssystemen arbeiten, kann es hilfreich sein, dies zu wissen.

Tim Kennedy
quelle
5

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) locateeinen täglichen cronJob 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 findoder lsnur zum Ausführen sudo updatedbund dann locate. Es ist definitiv schneller, wenn Sie mehr suchen müssen ... wie der Name schon sagt, updatedbaktualisiert die Datenbank, die locate...

locatehat eingebauten regulären Ausdruck, was es sehr praktisch macht ... Ich werde es findin einem Skript verwenden, aber ich verwende es selten findin der Kommandozeile. Ich benutze sogar locatein (persönlichen) Skripten ... zB.locate -bir "oo.*datt.*mp4$"

locate Gibt die vollständig qualifizierten Pfade übereinstimmender Dateien zurück.

Peter.O
quelle
2
find [path] -name [filename]

Wenn ich beispielsweise im Verzeichnis / home nach einem Dateinamen suchen möchte, der foo enthält, würde ich den folgenden Befehl verwenden:

find /home -name *foo*

Verwenden Sie den Befehl, man findum weitere Informationen zum Befehl find und zu den Argumenten zu erhalten.

Josh-Cain
quelle
3
Sie müssen das *s zitieren oder maskieren , um zu verhindern, dass die Shell sie interpretiert.
Shawn J. Goff
Ist das Distribution / Shell spezifisch? Ich habe es in Fedora 16 ohne Flucht ausgeführt und es hat gut funktioniert.
Josh-Cain
1
In einigen Shells gibt es Optionen, die die Sterne an das Programm weitergeben, wenn sie nicht mit etwas übereinstimmen. Versuchen Sie, eine Datei in Ihrem aktuellen Verzeichnis zu erstellen, die diesem Muster entspricht, und wiederholen Sie den Befehl.
Shawn J. Goff