Platzhalter-Negation [Duplikat]

Sep 30 2020

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

3 Kusalananda Sep 30 2020 at 16:52

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 Funktion shoptaktiviert ist, werden mehrere erweiterte Mustervergleichsoperatoren erkannt. In der folgenden Beschreibung ist a pattern-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

1 GiacomoCatenazzi Sep 30 2020 at 16:48

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.