J'ai plusieurs fichiers avec le même nom de fichier de base. Je voudrais supprimer tous 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 en utiliser rm foo.*
.
TLDP montre comment^
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 que ce ne soit pas 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 à quoi ressemblerait un glob qui ignore tout simplement foo.org
?
rm foo.*[^org]
supprime tous les fichiers dont le dernier caractère n'est ni l'un ni l'autreo
,r
et ne correspondg
doncfoo.foo
pas non plus.Regular Expression
. Vous devriez faire attention avec vos caractères de regroupement. En utilisant des crochets, vous avez spécifié une classe de caractères, ce qui signifie que vous supprimeriez tous les fichiers ayant une extension avec les lettreso
,r
oug
dans n'importe quel ordre. Utilisez des parenthèses pour créer un groupe et conserver l’ordre des caractères.foo.*[^org]
correspond à tout nom de fichier commençant parfoo.
un ou plusieurs caractères après le point où le dernier caractère n'est pas o, r ou g. Donc, cela correspondraitfoo.orb
, mais pasfoo.org
oufoo.or
oufoo.o
. La réponse de GlennJackman montre comment activer les fonctionnalités de correspondance de modèle étendue pour annuler une correspondance.Réponses:
C'est "foo". suivi de quelque chose NON "org"
ref: https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching
la source
@()
pour une liste de modèles: stackoverflow.com/a/217208/3779853En bash, vous pouvez également utiliser
GLOBIGNORE="*.org"; rm -i foo*
.Et
unset GLOBIGNORE
quand c'est fait.Ce n'est pas vraiment mieux que
shopt -s extglob
, mais je trouve plus facile de m'en souvenir.la source
( GLOBIGNORE="*.org"; rm -i foo* )
GLOBIGNORE="*foo*:*bar*"
Une pipe peut faire?
(Évidemment, vous voudrez peut-être remplacer echo par rm dans la dernière chaîne).
la source
ls -1
devrait être plus fiable pour s'assurer que tous les fichiers sont traitésgrep
séparémentOP était très proche:
bien que dans ce cas le
*
soit inutile.la source
foo.ort
etfoo.erg