J'ai rencontré des schémas de globbing et des caractères génériques et je suis particulièrement intéressé [!]
.
Cette construction est similaire à la
[!]
construction, sauf qu'au lieu de faire correspondre des caractères à l'intérieur des crochets, elle correspondra à n'importe quel caractère, tant qu'elle n'est pas répertoriée entre les[
et]
.
rm myfile [!192]
Je pense que ce qui précède supprimera tout / tous les fichiers, à l'exception de tous / tous les fichiers qui ont 192 dans leur nom.
Je suis cependant préoccupé par la bonne utilisation de ceci avec une extension de fichier, et en particulier de multiples conditions.
Quelle serait la syntaxe appropriée dans une telle situation?
rm myfile [!.gif .csv. mp3]
ou
rm myfile [!.gif !.csv !.mp3]
Je crains que la période ne soit mal placée, et donc tout fichier avec un .
(qui serait certainement l'un d'eux?) Serait alors manipulé, lorsque je chercherais à provoquer la manipulation de fichiers spécifiques.
Cette construction est similaire à la [ ]
construction, sauf qu'au lieu de faire correspondre des caractères à l'intérieur des crochets, elle correspondra à n'importe quel caractère, tant qu'elle n'est pas répertoriée entre les [
et ]
.
(extrait de http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm )
Maintenant; pour moi, cela suggère alors qu'un singulier !
est suffisant, et toutes les valeurs qui y figurent après sont contenues dans la plage.
la source
ls my-pattern
ouecho my-command
pour vérifier si le globbing est fait comme vous le souhaitez, avant d'exécuterrm
[!]
est similaire mais pas comme[!]
^
a exactement la même signification que!
dans ce contexte,[^a]
exclut donca
exactement comme le[!a]
fait: Si le premier caractère suivant le [est un! ou ^ alors tout caractère non inclus est mis en correspondance. (man bash
)rm myfile [!192]
supprimeramyfile
, ainsi que tout fichier caractère non nommé1
,9
ou2
.Réponses:
Citant
man 7 glob
:L'accent sur la partie à caractère unique ici
[]
ne peut pas être utilisé pour des chaînes entières dans Bash Pattern Matching.bash
L' expansion d'accolade de 's peut être utilisée pour faire correspondre des chaînes, mais il n'y a aucun moyen (je le sais) de les annuler. Par exempleest étendu à
peu importe si ces fichiers existent.
Comme l'a souligné wchargin ,
shopt
peut être utilisé pour activer les opérateurs de correspondance de modèle étendus, l'un d'eux étant!()
. Après la courseshopt -s extglob
, par exempleest étendu à
si ces fichiers existent dans le répertoire courant. Pour plus d'informations, consultez la
man bash
section EXPANSION / Expansion de noms de chemins) et Expansion de noms de chemins (globbing) .Pour ce que vous essayez de faire, je l'utilise toujours
find
, ce qui offre la négation et bien plus encore, par exemple de la manière suivante:Cela répertorie simplement les résultats, si vous souhaitez les supprimer, ajoutez simplement l'
-delete
option à la fin de la commande. Comme toujours pour supprimer des actions: vérifiez toujours soigneusement en premier .find
offre une tonne d'options utiles très bien expliquées parman find
.la source
find
commande est récursive ( edit: comme il a été montré à l'origine - je pourrais garder ce commentaire pour les informations supplémentaires pertinentes mais non essentielles qu'il véhicule). Pour rechercher des fichiers résidant uniquement dans le répertoire courant mais pas également dans ses sous-répertoires - et donc supprimer uniquement ces fichiers si l'-delete
action est ajoutée - vous pouvez les ajouter-maxdepth 1
immédiatement aprèsfind .
. Cela le mettrait en ligne avec l'effet du globbing, car les globs ne sont pas récursifs dans Bash, sauf si l'globstar
option shell est activée et**
utilisée. Le glob représenté dans la question n'est pas récursif dans tous les obus.shopt -s extglob
, vous pouvez utiliserecho 1.!(gif|csv|mp3)
, qui imprime tout1.ext
oùext
n'est pasgif
,csv
oump3
. (Voir la sous-section "Pattern Matching" deman bash
.)Je pense que vous avez mal compris l'utilisation des crochets.
[abc]
correspond à l' un des caractèresa
,b
ouc
.[!abc]
correspond à un caractère qui ne l' est pasa
,b
ouc
. Donc le commandementsupprimera
myfile
et les fichiers1
,9
et2
parce que vous avez un espace entre mon fichier et le support. En revanche, la commandesupprimera les fichiers
myfile1
,myfile9
etmyfile2
.la source
find
.Les parenthèses
[
]
désignent une classe de caractères. N'importe quel caractère à l'intérieur d'eux peut correspondre à la position donnée. Donccorrespond à trois noms possibles:
Il ne correspond pas
file192
, car il ne traite que le caractère unique aprèsfile
.Nous pouvons également utiliser des plages entre parenthèses.
[0-9]
correspond à n'importe quel chiffre dans la position donnée. Pour deux chiffres, nous avons besoin[0-9][0-9]
. Pour un chiffre suivi d'une majuscule, nous pourrions utiliser[0-9][A-Z]
...!
indique la négation.correspondra aux fichiers qui ont n'importe quel caractère après
file
sauf1
ou9
ou2
. Par exemple, il correspondra àfile7
etfiles
etfile%
(et bien d'autres) mais pasfile192
, car cela a deux caractères supplémentaires.Pour votre cas d'utilisation, je suggère d'utiliser
find
au lieu de[!]
. Il a unnot
opérateur.Il est également récursif , ce qui signifie qu'il va dans tous les sous-répertoires par défaut. Vous pouvez le limiter au répertoire courant avec
-maxdepth 1
, si c'est ce que vous voulez. Les caractères génériques du shell (globbing) ne sont pas récursifs (bien que le globbing récursif avec**
puisse être activé).En supposant que vous ne voulez pas éviter de supprimer des liens symboliques, nous pouvons ajouter
-type d
aux tests annulés pour éviter de supprimer des répertoires. Merci à Eliah Kagan pour cette suggestion.Si vous voyez ce que vous voulez, vous pouvez réexécuter la commande avec
-delete
la source
[0-9a-fA-F]