it-swarm.com.de

Schließen Sie ein Muster von der Glob-Übereinstimmung aus

Ich habe mehrere Dateien mit demselben 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 rm foo.* Verwenden.

TLDP demonstriert ^, um eine Übereinstimmung zu negieren. Durch Versuch und Irrtum konnte ich das finden

rm foo.*[^org]

macht was ich brauche, aber ich verstehe die Syntax nicht wirklich.

Auch wenn dies in meinem Anwendungsfall keine Einschränkung darstellt, ignoriert dieses Muster meiner Meinung nach auch foo.o Und foo.or. Wie funktioniert dieses Muster und wie würde ein Glob aussehen, der nur foo.org Ignoriert?

64
jake
shopt -s extglob
echo rm foo.!(org)

Das ist "foo". gefolgt von etwas NICHT "org"

ref: https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching

63
glenn jackman

In Bash können Sie auch GLOBIGNORE="*.org"; rm -i foo* Verwenden.

Und unset GLOBIGNORE Wenn fertig.

Es ist nicht wirklich besser als shopt -s extglob, Aber ich finde es einfacher, mich zu erinnern.

26
mivk

Eine Pfeife kann?

ls * | grep -v "foo.org" | xargs -I {} echo {}

(Natürlich möchten Sie möglicherweise das Echo in der letzten Kette durch rm ersetzen.).

8
Adobe