Ich habe mehrere Dateien mit dem gleichen Basisdateinamen. Ich möchte alle bis auf einen entfernen
foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
Wenn ich keinen behalten müsste, könnte ich ihn gebrauchen rm foo.*
.
TLDP zeigt ^
, dass eine Übereinstimmung annulliert wird . Durch Versuch und Irrtum konnte ich das herausfinden
rm foo.*[^org]
tut was ich brauche, aber ich verstehe die Syntax nicht wirklich.
Auch wenn dies in meinem Anwendungsfall keine Einschränkung darstellt, denke ich, dass dieses Muster auch foo.o
und ignoriert foo.or
. Wie funktioniert dieses Muster und wie würde ein Globus, der ignoriert, nur foo.org
aussehen?
rm foo.*[^org]
entfernt alle Dateien , die letzten Zeichen sind wedero
,r
oderg
, sofoo.foo
würde entweder nicht überein.Regular Expression
. Sie sollten mit Ihren Gruppierungszeichen vorsichtig sein. Mit Hilfe von Klammern haben Sie eine Zeichenklasse angegeben, die bedeutet, dass Sie alle Dateien löschen, die eine Erweiterung mit den Buchstaben habeno
,r
oderg
in beliebiger Reihenfolge. Verwenden Sie Klammern, um eine Gruppe zu erstellen und die Reihenfolge der Zeichen beizubehalten.foo.*[^org]
stimmt mit jedem Dateinamen überein, derfoo.
mit einem oder mehreren Zeichen nach dem Punkt beginnt, wobei das letzte Zeichen nicht o, r oder g ist. Also würde es passenfoo.orb
, aber nichtfoo.org
oderfoo.or
oderfoo.o
. Die Antwort von GlennJackman zeigt, wie erweiterte Mustervergleichsfunktionen zum Negieren einer Übereinstimmung aktiviert werden.Antworten:
Das ist "foo". gefolgt von irgendetwas NICHT "org"
Ref: https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching
quelle
@()
für eine Musterliste: stackoverflow.com/a/217208/3779853In Bash können Sie auch verwenden
GLOBIGNORE="*.org"; rm -i foo*
.Und
unset GLOBIGNORE
wenn es fertig ist.Es ist nicht wirklich besser als
shopt -s extglob
, aber ich finde es leichter, mich zu erinnern.quelle
( GLOBIGNORE="*.org"; rm -i foo* )
GLOBIGNORE="*foo*:*bar*"
Eine Pfeife kann?
(Natürlich möchten Sie das Echo in der letzten Kette durch rm ersetzen.)
quelle
ls -1
sollte zuverlässiger sein, um sicherzustellen, dass alle Dateiengrep
separat behandelt werdenOP war sehr nah:
in diesem Fall ist das
*
jedoch unnötig.quelle