it-swarm.com.de

Dateien auflisten, die keinem Muster entsprechen?

So können Sie alle Dateien auflisten, die mit einem Muster in Bash übereinstimmen:

ls *.jar

Wie liste ich das Komplement eines Musters auf? d.h. alle Dateien stimmen nicht mit * .jar überein?

54
paislee
ls | grep -v '\.jar$'

zum Beispiel.

Verwenden Sie den erweiterten Mustervergleich im egrep-Stil.

ls !(*.jar)

Dies ist ab bash-2.02-alpha1 verfügbar. Muss erst mit aktiviert werden

shopt -s extglob

Ab Bash-4.1-Alpha gibt es eine Konfigurationsoption, um dies standardmäßig zu aktivieren.

70
Christian

Wenig bekannte Bash-Erweiterungsregel:

ls !(*.jar)
33
ccarton

POSIX definiert nicht übereinstimmende Klammerausdrücke, sodass die Shell die Dateinamen für uns erweitern kann.

ls *[!j][!a][!r]

Dies hat zwar einige Macken, aber zumindest ist es mit etwa jeder Unix-Shell kompatibel.

18
stefanct

Mit einer geeigneten Version von find könnten Sie so etwas tun, aber es ist ein wenig übertrieben:

find . -maxdepth 1 ! -name '*.jar'

find findet Dateien. Das Argument . Gibt an, dass Sie mit der Suche ab . Beginnen möchten, d. H. Ab dem aktuellen Verzeichnis. -maxdepth 1 Teilt mit, dass Sie nur eine Ebene tief suchen möchten, d. H. Das aktuelle Verzeichnis. ! -name '*.jar' Sucht nach allen Dateien, die nicht mit dem regulären Ausdruck *.jar Übereinstimmen.

Wie gesagt, es ist ein wenig übertrieben für diese Anwendung, aber wenn Sie den -maxdepth 1 Entfernen, können Sie rekursiv nach allen Nicht-JAR-Dateien suchen oder was Sie leicht haben.

15
Dan Fego

Und wenn Sie mehr als eine Dateierweiterung ausschließen möchten, trennen Sie sie mit einer Pipe | Wie ls test/!(*.jar|*.bar). Lass es uns versuchen:

$ mkdir test
$ touch test/1.jar test/1.bar test/1.foo
$ ls test/!(*.jar|*.bar)
test/1.foo

Wenn Sie sich die anderen Antworten ansehen, müssen Sie möglicherweise zuerst shopt -s extglob.

2
James Brown

Eine Lösung wäre ls -1|grep -v '\.jar$'

2
fge

Wenn Ihr ls es unterstützt (man ls) benutze den --hide=<PATTERN> Möglichkeit. In deinem Fall:

$> ls --hide=*.jar

Die Ausgabe von ls muss nicht analysiert werden (weil sie sehr schlecht ist), und es werden nicht mehrere Dateitypen angezeigt. Irgendwann musste ich herausfinden, welche Dateien in einem (überfüllten) Verzeichnis ohne Quelle, ohne Objekt und ohne Libtool erstellt wurden:

$> ls src --hide=*.{lo,c,h,o}

Lief wie am Schnürchen.

2
haavee

Ein anderer Ansatz kann ls -I flag (Muster ignorieren).

ls -I '*.jar'