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?
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.
Wenig bekannte Bash-Erweiterungsregel:
ls !(*.jar)
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.
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.
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
.
Eine Lösung wäre ls -1|grep -v '\.jar$'
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.
Ein anderer Ansatz kann ls -I
flag (Muster ignorieren).
ls -I '*.jar'