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?
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
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.
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).