Was ist das Linux-Äquivalent zu DOS „dir / s / b Dateiname“?

17

Listet alle Dateien / Verzeichnisse im oder unter dem aktuellen Verzeichnis auf, die mit "Dateiname" übereinstimmen.

mackenir
quelle

Antworten:

28

Das direkte Äquivalent ist

find . -iname <filename>

Hier werden alle <filename>im aktuellen Verzeichnis und in allen Unterverzeichnissen aufgerufenen Dateien und Verzeichnisse aufgelistet, wobei Groß- und Kleinschreibung ignoriert wird.

Wenn Ihre Version von find nicht unterstützt wird -iname, können Sie -namestattdessen verwenden. Beachten Sie, dass im Gegensatz zu -iname, -nameGroß- und Kleinschreibung.

Wenn Sie nur die aufgerufenen Dateien <filename>und nicht die Verzeichnisse auflisten möchten , fügen Sie hinzu-type f

find . -iname <filename> -type f

Wenn Sie Platzhalter verwenden möchten, müssen Sie diese in Anführungszeichen setzen, z

find . -iname "*.txt" -type f

Andernfalls wird die Shell sie erweitern.

Wie andere bereits betont haben, können Sie auch Folgendes tun:

find . | grep "\.txt$"

grep druckt Zeilen basierend auf regulären Ausdrücken, die leistungsfähiger als Platzhalter sind, aber eine andere Syntax haben.

Siehe man findund man grepfür weitere Details.

Mikel
quelle
3
Wenn <filename>Platzhalter enthalten sind, setzen Sie sie in Anführungszeichen, z find . -name '*.txt'.
Gilles 'SO- hör auf böse zu sein'
@ Gilles, aktualisierte meine Antwort, um das zu sagen, danke.
Mikel
2
Die Verwendung <filename>als Markierung für die Benutzereingabe ist in Befehlszeilenumgebungen, in denen die < and >meiste Zeit eine bestimmte Bedeutung hat, eine schlechte Angewohnheit . Ich schlage vor, nur filenameFILENAME zu verwenden, um es hervorzuheben. Die meisten Menschen werden verstehen, und diejenigen, die dies nicht tun, können Schaden anrichten, wenn sie nicht verstehen, dass sie nicht das Zeichen kleiner oder größer als treffen sollen.
Benutzer unbekannt
2
<filename>Es ist eine Konvention in vielen UNIX-Dokumentationen, daher denke ich, dass es nützlich ist, dass sich die Leute darüber im Klaren sind, aber ich stimme zu, dass es FILENAMEmöglicherweise einfacher ist, sie zu verstehen.
Mikel
1
find -iname <filename>ist besser, da die Groß- und Kleinschreibung nicht berücksichtigt wird wie bei DOS
Agnel Kurian
8

Einige Muscheln erlauben ls **/filename, was sehr praktisch ist.

Shawn J. Goff
quelle
1
Guter Punkt. In neueren Versionen von bash ist running shopt -s globstar; echo **/filenameäquivalent zu find . -name "filename". Es funktioniert auch in zsh.
Mikel
Dieser "ls ** / filename" ist in Ordnung, scheint aber nicht mehr als eine Verzeichnisebene tief zu gehen.
Sopalajo de Arrierez
@ sopalajo-de-arrierez Wenn du das tust shopt -s globstar, wird es wahrscheinlich für dich funktionieren. Rekursives Globbing ist eine Funktion, die nur in einigen Shells verfügbar ist und manchmal nicht standardmäßig aktiviert ist.
Shawn J. Goff
Ops ... Ich verstehe jetzt, @ ShawnJ.Goff: Der shoptBefehl aktiviert die Option globstar on. Jetzt funktioniert es wie ein Zauber. Danke vielmals.
Sopalajo de Arrierez
4

Sie können dies mit tun

find . | egrep filename
Matten
quelle
1
Sie könnten es auch in einem mit find . -regextype posix-egrep -regex '.*filename.*'(Ich weiß nicht, ob der egrepTeil wichtig ist, aber Sie haben egrepin Ihrer Antwort verwendet, also habe ich es eingeschlossen)
Michael Mrozek
Sie können, aber grep unterscheidet sich vom entsprechenden DOS-Befehl. grepverwendet reguläre Ausdrücke, während der DOS-Befehl Shell-Platzhalter verwendet.
Mikel
1
Wenn Sie sich das vorstellen, unterscheiden sich Shell-Globs auch von DOS-Wildcards. Zum Beispiel find . -name "*.*"wird nicht tun, was Sie von einem DOS-Hintergrund erwarten würden. Globs sind nah genug, um erkennbar zu sein, während Regexes ein völlig neues Biest sind.
Jander
Was macht *.*.*man in einem modernen DOS zB Windows Cmd? Was ist *.*.*.*?
Strg-Alt-Delor
0

Es kann auch sein: tree -if </your/path>oder 'pwd'als Pfad

Michael Fatahov
quelle