Klammererweiterung verwenden

Klammererweiterung verwenden

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 ahaben 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, lsohne 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, grepHilfe zu rufen, dann

ls *[aA]* | grep -i b

wird es auch tun.

verwandte Informationen