Listen Sie Dateien mit bestimmten Erweiterungen mit ls und grep auf


151

Ich möchte nur die Dateien aus dem aktuellen Verzeichnis abrufen und nur .mp4 .mp3 .exe-Dateien ausgeben, sonst nichts. Also dachte ich, ich könnte das einfach machen:

ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$

Aber nein, da der erste grep nur mp4s ausgibt, werden die anderen 2 grep's nicht verwendet.

Irgendwelche Ideen? PS: Führen Sie dieses Skript auf Slow Leopard aus.


1
Dies ist wirklich der falsche Ansatz - anstatt grep zu verwenden, verwenden Sie shopt -s nullglobund verweisen Sie dann einfach auf *.exe *.mp3 *.mp4. Siehe mywiki.wooledge.org/ParsingLs
Charles Duffy

1
Ich kann nicht herausfinden, ob "Slow Leopard" ein Tippfehler war oder nicht ...
Wowfunhappy

1
@Wowfunhappy hahaha, war definitiv ein Tippfehler, ich erinnere mich, dass Snow Leopard ziemlich schnell war.
Münze

Antworten:


334

Warum nicht:

ls *.{mp3,exe,mp4}

Ich bin mir nicht sicher, wo ich es gelernt habe - aber ich habe es benutzt.


1
Dies funktioniert bei mir nicht, da die von mir verwendete Erweiterung für ein Verzeichnis gilt und das ls den Inhalt des Verzeichnisses auflistet.
Richard Venable

1
@RichardVenable Fügen Sie den Schalter -d hinzu, um zu verhindern, dass Verzeichnisse erneut verwendet werden.
Carlos Eugenio Thompson Pinzón

11
Ich mag diese Lösung, aber es scheint zu scheitern, wenn Sie einen der Dateitypen vermissen. Zum Beispiel haben Sie MP3, aber keine
EXE-Datei

2
Ich habe stderr nach / dev / null umgeleitet, um ls: *.exe: No such file or directoryzB Folgendes zu vermeiden :ls *.{zip,tar.gz,tar} 2>/dev/null
Isaac

1
Wenn ich ls foo *. {Tar.gz, zip} direkt in einer Shell ausführe, funktioniert es, aber wenn dies in ein Shell-Skript eingefügt wird, ist last = $ (ls -I ' .done' -tr $ {pkgprefix} . {Tar. gz, zip} | tail -1) Ich habe eine Fehlermeldung erhalten: ls: kann nicht auf 'bamtools * zugreifen. {tar.gz, zip}': Keine solche Datei oder kein solches Verzeichnis, jeder klügere Typ kann die Antwort verfeinern.
Kemin Zhou

41

Verwenden Sie reguläre Ausdrücke mit find:

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n'

Wenn Sie die Dateinamen weiterleiten:

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething

Dies schützt Dateinamen, die Leerzeichen oder Zeilenumbrüche enthalten.

OS X findunterstützt den Wechsel nur, wenn die -E(erweiterte) Option verwendet wird.

find -E . -regex '.*\.(mp3|mp4|exe)'

2
Unter Mac OS X:find . -iregex '.*\(mp3\|mp4\|exe\)'
Andilabs

3
andi, das hat bei mir auf mac os nicht funktioniert. Aber das tat: finde -E. -regex '. * (mp3 | mp4 | exe)'
Joseph Johnson

Diese Lösung lädt Dateien wie: mysupermp3.jpg$\\.
Erwägen Sie

1
@ Pantro: Eigentlich wird es nicht. Find scheint implizite Anker zu verwenden. Der Punkt ist eine gute Idee (es wird nur ein Backslash benötigt).
Bis auf weiteres angehalten.

38

egrep - Extended Grep - wird hier helfen

ls | egrep '\.mp4$|\.mp3$|\.exe$'

sollte den Job machen.


Das ist es! Danke Ich habe gerade festgestellt, dass ich die Groß- und Kleinschreibung nicht berücksichtigen sollte, also verwende ich: ls | egrep -i '\ .mp4 $ | \ .mp3 $ | \ .exe $ Falls jemand anderes eines Tages Hilfe benötigt. Ich bin immer überrascht von der Geschwindigkeit, mit der ich hier meine Antwort bekomme.
Mint

Ich kann nicht sehen, wie das funktionieren würde. ls ohne Optionen erzeugt eine Ausgabe in Spalten. Die Verankerung am Ende der Linie stimmt nicht richtig überein.
Camh

4
@camh: lsan ein Terminal (oder mit -COption) erzeugt eine mehrspaltige Ausgabe. lszu einem Rohr (oder mit -1) hat eine einspaltige Ausgabe. (Ausgabe von lsmit vergleichen ls | cat).
Mob

Am Ende fehlt ein Apostroph. Davon abgesehen scheint es zu funktionieren.
Björn

12

Am einfachsten ist es, nur ls zu verwenden

ls *.mp4 *.mp3 *.exe

2
Danke, aber ich habe das bereits versucht und die Fehler, die Sie erhalten, wenn keine Datei vorhanden ist, haben mir nicht gefallen. Du könntest das beheben, indem du tust: ls * .mp4 * .mp3 * .exe 2> / dev / null Ich dachte jetzt nur daran: P
Mint

1
Ich bin überrascht, dass lses keine stille Option gibt.
MitMaro

2
In Bash können Sie "set -o nullglob" ausführen, und Sie erhalten keine Fehler.
Camh

2
Mein Fehler - das sollte "shopt -s nullglob" sein, nicht der Befehl set -o
camh

1
Oder verwenden Sie einfach "echo": echo * .mp4 * .mp3 * .exe
Adrian Pronk

9

Nur für den Fall: Warum benutzt du nicht find?

find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4'

Ich fand, dass dies stattdessen funktionierte - find . -name '*.mkv' -o -name '*.flv'(Hinzufügen von so vielen -o-Klauseln wie erforderlich). Ich brauchte das ., um das Verzeichnis und das Flag -namenicht anzugeben -iname- ich bin auf macOS 10.13.
Chris

6

Keine Notwendigkeit für grep. Shell-Platzhalter reichen aus.

ls *.mp4 *.mp3 *.exe

Wenn du gelaufen bist

shopt -s nullglob

dann werden nicht übereinstimmende Globs vollständig entfernt und nicht in der Befehlszeile nicht erweitert.

Wenn Sie ein Globbing ohne Berücksichtigung der Groß- und Kleinschreibung wünschen (daher entspricht * .mp3 foo.MP3):

shopt -s nocaseglob

Gleicher Kommentar, den ich Good Time Tribe gegeben habe.
Mint

1
Ich versuche dies mit der -ROption zu verwenden, um übereinstimmende Dateien in Unterverzeichnissen aufzulisten, aber die Option scheint keine Auswirkung zu haben und ich erhalte immer noch nur die Ergebnisse des aktuellen Verzeichnisses.
Chris

3

Falls Sie noch nach einer alternativen Lösung suchen:

ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$'

Fühlen Sie sich frei, bei Bedarf weitere -e-Flags hinzuzufügen.


3

Für OSX-Benutzer :

Wenn Sie verwenden ls *.{mp3,exe,mp4}, wird ein Fehler ausgegeben, wenn eine dieser Erweiterungen keine Ergebnisse liefert.

Mit using ls *.(mp3|exe|mp4)werden alle Dateien zurückgegeben, die diesen Erweiterungen entsprechen, auch wenn eine der Erweiterungen 0 Ergebnisse hatte .


5
Ich habe einen Syntaxfehler anhand Ihres Beispiels erhalten. 'bash: Syntaxfehler in der Nähe eines unerwarteten Tokens' ('
Nagordon

2
Ich denke du meinst ls *.@(mp3|exe|mp4). Sie müssen shopt -s extglobdamit funktionieren. Ist übrigens auch lsnutzlos, könnte man einfach machen printf '%s\n' *.@(mp3|exe|mp4).
gniourf_gniourf

1
Ich bekomme die Syntax unerwartete Token-Nachricht auf macOS 10.13
Chris

1
ls | grep "\.mp4$
\.mp3$
\.exe$"

Danke, aber etwas unpraktisch, wenn mehrere Zeilen verbraucht werden.
Mint

Dies + mdfindliefert die besten / schnellsten Suchanfragen aller Zeiten! mdfind -name querystring | grep "\.h$" findet alle Header mit Quesrystring im Dateititel. pronto.
Alex Gray

1

ls -R | findstr ".mp3"

ls -R => listet Unterverzeichnisse rekursiv auf


-1

Hier ist ein Beispiel, das für mich funktioniert hat.

find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.