Können Bash-Platzhalter negative Übereinstimmungen angeben?

Können Bash-Platzhalter negative Übereinstimmungen angeben?

Ist bashes möglich, Platzhalter zu verwenden, um „alle Dateien im aktuellen Verzeichnis AUSSER [Dateien, die einem bestimmten (Platzhalter-)Muster entsprechen]“ anzugeben? Z. B. „alle Dateien, die nicht mit *~ übereinstimmen“

Oder allgemeiner: Ist es möglich, eine Platzhalter-Dateispezifikation mit einer zweiten, filternden oder negierenden Spezifikation zu qualifizieren?

Antwort1

Natürlich. Angenommen, Sie möchten alle Dateien, die die Zeichenfolge "foo" im Namen enthalten, aber keine, die auch "bar" enthalten. Sie möchten also

foo1
foo2

Aber du willst nicht

 foobar1

Sie können dazu einfaches Globbing verwenden, und zwar folgendermaßen:

for f in foo!(bar)*; echo $f; done

oder so

ls foo[^bar]*

Weitere Informationen finden Sie hier:http://www.tldp.org/LDP/abs/html/globbingref.htmlAchtung, beide Methoden haben ihre Tücken. Wahrscheinlich sind Sie mit besser bedient find.

Antwort2

Danke, Bjanssen, dass Sie auf Bash hingewiesen haben extglob shopt, das diese Art von Globbing ermöglicht.

Aus der bashManpage:

If the extglob shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized. In the following 
description, a pattern-list is a list of one or more patterns separated 
by a |.  Composite patterns may be formed using one or more of the following
sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

Um also meine Frage zu beantworten: „Wie spezifiziert manalle Dateien die nicht übereinstimmen *~" :

!(*~)

oder, ohne dass dies erforderlich ist extglob:

*[^~]

Und allgemeiner als Antwort auf den letzten Teil meiner Frage:

The GLOBIGNORE shell variable may be used to restrict the set of file names
matching a pattern. If GLOBIGNORE is set, each matching file name that also
matches one of the (colon-separated) patterns in GLOBIGNORE is removed from
the list of matches.

verwandte Informationen