„oder“ im Shell-Glob

„oder“ im Shell-Glob

Ich möchte die Dateien durchsuchen, deren Dateinamen die Teilzeichenfolge „s1r“, „s2r“, „s3r“ oder „s19r“ enthalten.

Ich bin fast da!

Misslungene Versuche:

ls *s[123][9?]r*

Das Obige gibt mir nur Dateien, die den Teilstring enthalten

s19r

Während

ls *s[1-3]|[19]r*

kehrt zurück

-bash: [19]r*: Befehl nicht gefunden

ls: *s[1-3]: Keine solche Datei oder kein solches Verzeichnis

Das heißt, der Operator „oder |“ wird nicht erkannt. Dies ist sinnvoll, da dieser auch zum Weiterleiten verwendet wird.

Wie suche ich nach Dateien, die „s1r“, „s2r“, „s3r“ oder „s19r“ enthalten?

Antwort1

Verwenden ls *s1r* *s2r* *s3r* *s19r*.

Wenn Sie nicht vorhandene Dateien berücksichtigen möchten, können Sie die Option „Nullglob“ festlegen:

          nullglob
                  If  set,  bash allows patterns which match no files (see
                  Pathname Expansion above) to expand to  a  null  string,
                  rather than themselves.

Wenn Ihre Shell nicht Bash ist, gibt es wahrscheinlich einen ähnlichen Weg. Sehen Sie sich die Manpage dazu an.

Antwort2

Sie können Folgendes versuchen:

ls *s?([123])r* *s19r*

Zum Beispiel

Ich habe ein Verzeichnis mit folgenden Dateien:

% ls | column
s10r    s12r    s14r    s16r    s18r    s1r s2r s4r s6r s8r
s11r    s13r    s15r    s17r    s19r    s23r    s3r s5r s7r s9r

Unter Verwendung des oben genannten ls:

% ls *s?([123])r* *s19r*
s19r  s1r  s2r  s3r

Sehen Sie sich dieBash-Handbuch zur Musterübereinstimmungfür mehr Details.

verwandte Informationen