
Ist bash
es 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 bash
Manpage:
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.