Verwenden mehrerer Platzhalter in einem Glob

Verwenden mehrerer Platzhalter in einem Glob

In meinem Verzeichnis habe ich eine Liste von Dateien mit verschiedenen Erweiterungen wie

file-abc-12.out
file-abc-12.csv
file-abc-12.txt
file-xyz-12.out
file-xyz-12.csv
file-xyz-12.txt
file-abc-04.out
file-abc-04.csv
file-abc-04.txt
file-xyz-04.out
file-xyz-04.csv
file-xyz-04.txt

Wie gehe ich vor, wenn ich nur die Dateien auflisten möchte, die abc enthalten und mit .out enden? Ich möchte ein lsoder ein findmit zwei Mustervergleichssuchen *abc*und durchführen *out. Ich weiß nur, wie ich nach dem einen oder dem anderen gleichzeitig suchen kann. Wie kann ich nach Dateinamen mit beiden Bedingungen suchen?

Antwort1

Dadurch erhalten Sie, was Sie möchten:

$ find . -name '*abc*' -o -name '*out'

Antwort2

Ich interpretiere das in der Frage verwendete "und" als striktes "logisches und", also als "Dateien finden, deren Namen übereinstimmenbeide *abc*Und *out".

Sie können mehrere Platzhalter in einem Dateinamen-Globbing-Muster verwenden:

$ ls *abc*out

oder

$ find . -type f -name "*abc*out"

Zum Beispiel.

Das Muster *abc*outwürde mit jedem Namen übereinstimmen, der die Zeichenfolge enthält abcund mit endet out.

Wenn keine Datei dem Muster entspricht, wird das Muster nicht erweitert. Wenn das passiert, lserhält das Muster *abc*outals Argument anstelle eines gültigen Dateinamens und beschwert sich darüber ls: cannot access *abc*out: No such file or directory.

Um basheinen Fehler anzuzeigen, der besagt, dass ein Globbing-Muster für Dateien nicht erweitert werden kann, anstatt das nicht erweiterte Muster an zu übergeben ls, legen Sie die failglobShell-Option fest:

bash-4.4$ ls *abc*out
ls: *abc*out: No such file or directory

bash-4.4$ shopt -s failglob

bash-4.4$ ls *abc*out
bash: no match: *abc*out

Antwort3

Die Lösung, die für mich funktioniert hat, besteht in der Verwendung von grep. Sie lautet:

$ ls *out | grep "abc"

verwandte Informationen