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 ls
oder ein find
mit 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*out
würde mit jedem Namen übereinstimmen, der die Zeichenfolge enthält abc
und mit endet out
.
Wenn keine Datei dem Muster entspricht, wird das Muster nicht erweitert. Wenn das passiert, ls
erhält das Muster *abc*out
als Argument anstelle eines gültigen Dateinamens und beschwert sich darüber ls: cannot access *abc*out: No such file or directory
.
Um bash
einen 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 failglob
Shell-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"