web-dev-qa-db-fra.com

Exclure un modèle de la correspondance globale

J'ai plusieurs fichiers avec le même nom de fichier de base. Je voudrais supprimer tout sauf un

foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc

Si je n'avais pas besoin d'en garder un, je sais que je pourrais utiliser rm foo.*.

TLDP montre ^ pour annuler une correspondance. Par essais et erreurs, j'ai pu constater que

rm foo.*[^org]

fait ce dont j'ai besoin, mais je ne comprends pas vraiment la syntaxe.

De plus, bien qu'il ne s'agisse pas d'une limitation dans mon cas d'utilisation, je pense que ce modèle ignore également foo.o et foo.or. Comment fonctionne ce modèle et que ferait un glob qui ignore uniquement foo.org ressembler?

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

C'est "foo". suivi de tout ce qui n'est PAS "org"

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

63
glenn jackman

En bash, vous pouvez également utiliser GLOBIGNORE="*.org"; rm -i foo*.

Et unset GLOBIGNORE lorsque vous avez terminé.

Ce n'est pas vraiment mieux que shopt -s extglob, mais je trouve ça plus facile à retenir.

26
mivk

Une pipe peut faire?

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

(évidemment, vous voudrez peut-être remplacer echo par rm dans la dernière chaîne).

8
Adobe