Platzhalter-Negation [Duplikat]
Wie kann ich die ergänzenden Ergebnisse einer Wildcard-Erweiterung erhalten?
Wenn ich die Dateien auflisten möchte, rocderen Namen enthalten sind, führe ich aus
ls *roc*
aber was ist, wenn ich alle Dateien haben möchte, die nicht rocim Namen enthalten sind?
ls *[!r][!o][!c]* und ls *[!roc]*
arbeite nicht. Gibt es eine einfache Möglichkeit, diese "entgegengesetzte" Erweiterung durchzuführen?
Hinweis: Ich benutze bash
Antworten
Die bashShell unterstützt erweiterte Globbing-Muster, wenn Sie sie mit aktivieren
shopt -s extglob
Nach der Aktivierung !(*roc*)würde das Muster mit jedem nicht ausgeblendeten Namen übereinstimmen *roc*, der nicht übereinstimmt , dh mit jedem Namen, der die Zeichenfolge nicht enthält roc.
Aus dem bashHandbuch:
Wenn die
extglobShell-Option mithilfe der integrierten Funktionshoptaktiviert ist, werden mehrere erweiterte Mustervergleichsoperatoren erkannt. In der folgenden Beschreibung ist apattern-listeine Liste von einem oder mehreren Mustern, die durch a getrennt sind|. Zusammengesetzte Muster können unter Verwendung eines oder mehrerer der folgenden Untermuster gebildet werden:
?(pattern-list)Entspricht null oder einem Vorkommen der angegebenen Muster
*(pattern-list)Entspricht null oder mehr Vorkommen der angegebenen Muster
+(pattern-list)Entspricht einem oder mehreren Vorkommen der angegebenen Muster
@(pattern-list)Entspricht einem der angegebenen Muster
!(pattern-list)Entspricht allem außer einem der angegebenen Muster
Hinweis: Dies ist nicht das, was Sie verlangen, sondern nur eine Problemumgehung, die das liefert, was Sie verlangen
Normalerweise formuliere ich das Problem neu und mache Folgendes:
ls * | grep -v roc
Ich bevorzuge die Verwendung allgemeiner Tools (und allgemeiner Befehle, die ich verwende), anstatt nach etwas zu suchen, das ich wahrscheinlich einmal im Jahr verwenden werde (und das ich wahrscheinlich vergessen werde).
Das Arbeiten mit Platzhaltern kann sehr komplex werden: Unterschiedliche Shells führen zu unterschiedlichen Ergebnissen, sodass Skripte möglicherweise nicht portierbar sind.