
Im Grunde möchte ich diese beiden Befehlszeilen zusammenfügen
ls *[Aa]*
ls *[Bb]*
Ich suche nach einer Datei, die sowohl A als auch B (Klein- oder Großbuchstaben) enthält und die Buchstaben mehr als einmal vorkommen können.
Folgendes habe ich versucht:
ls *[Aa]*&&*[Bb]*
Antwort1
Klammererweiterung verwenden
Eine Methode besteht darin, Klammern zu verwenden. Betrachten wir ein Verzeichnis mit diesen Dateien:
$ ls
1a2a3 1a2b3 1b2A3 1b2b3
So wählen Sie diejenigen aus, die beides a
haben b
:
$ ls *{[bB]*[aA],[aA]*[bB]}*
1a2b3 1b2A3
Verbesserung
Ein mögliches Problem ist, wie sich die Klammererweiterung verhält, wenn eine der Optionen keine passenden Dateien hat. Stellen Sie sich ein Verzeichnis mit diesen Dateien vor:
$ ls
1a2a3 1b2A3 1b2b3
Lassen Sie uns nun unseren Befehl ausführen:
$ ls *{[bB]*[aA],[aA]*[bB]}*
ls: cannot access '*[aA]*[bB]*': No such file or directory
1b2A3
Wenn uns diese Warnmeldung nicht gefällt, können wir nullglob festlegen und sie verschwindet:
$ shopt -s nullglob
$ ls *{[bB]*[aA],[aA]*[bB]}*
1b2A3
Eine Einschränkung dieses Ansatzes besteht jedoch darin, dass, wenn keiner der Globs übereinstimmt, ls
ohne Argumente ausgeführt wird und folglich alle Dateien aufgelistet werden.
Erweiterte Globs verwenden
Betrachten wir noch einmal ein Verzeichnis mit diesen Dateien:
$ ls
1a2a3 1a2b3 1b2A3 1b2b3
Lassen Sie uns nun Folgendes festlegen extglob
:
$ shopt -s extglob
Und verwenden wir einen erweiterten Glob, um unsere Dateien zu finden:
$ ls *@([bB]*[aA]|[aA]*[bB])*
1a2b3 1b2A3
Antwort2
Wenn es Ihnen nichts ausmacht, grep
Hilfe zu rufen, dann
ls *[aA]* | grep -i b
wird es auch tun.