Normalement, bash globbing est sensible à la casse:
$ echo c*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo C*
CarePackage.md ChocRippleCake.md Clips
L'utilisation de crochets ne semble pas changer cela:
$ echo [c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C]*
CarePackage.md ChocRippleCake.md Clips
Il ne le change toujours pas si un trait d'union est utilisé:
$ echo [c-c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C-C]*
CarePackage.md ChocRippleCake.md Clips
Mais les lettres sont entrecoupées:
$ echo [B-C]*
CarePackage.md casefix.pike cdless chalices.py charconv.py chocolate.pike ChocRippleCake.md circum.py clip.pike Clips cpustats.pike crop.pike cwk2txt.py
$ echo [b-c]*
beehive-anthem.txt bluray2mkv.pike branch branchcleanup.pike burdayim.pike casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
Cela suggère que le tiret utilise un ordre de paramètres régionaux, "AaBbCcDd". Donc: existe-t-il un moyen de globaliser tous les fichiers commençant par une lettre majuscule?
[A-Z]
correspondre les lettres minuscules dans bash?Réponses:
Dans la version 4.3 et ultérieure de bash, il existe une option shopt appelée
globasciiranges
:Selon les pages de manuel de shopt builtin gnu :
En conséquence, vous pouvez
Utilisez
shopt -u
pour désactiver.Une autre façon est de changer les paramètres régionaux en C. Vous pouvez le faire temporairement en utilisant un sous-shell:
Vous obtiendrez les résultats dont vous avez besoin, et lorsque le sous-shell est terminé, les paramètres régionaux de votre shell principal restent inchangés par rapport à ce qui était auparavant.
Une autre alternative consiste
[A-Z]
à utiliser l'expansion d'accolade{A..Z}
avec l'nullglob
option bash shopt.En activant l'
nullglob
option, si un modèle n'est pas mis en correspondance pendant l'expansion du nom de chemin, une chaîne nulle est renvoyée à la place du modèle lui-même.En conséquence, celui-ci fonctionnera comme prévu:
la source
[[:upper:]]
parce que je veux juste une partie de l'alphabet, mais cela fonctionne.man bash
dans votre terminal et rechercher (en utilisant/
) des globasciiranges.LC_ALL=C printf '%s\n' [A-Z]*
fonctionnerait pas pour votre deuxième solution - sans sous-coque? BTW: il y a une faute de frappe:,nullblog
mais c'est trop peu de caractères pour que je puisse la corriger.Vous pouvez très bien écrire toutes les lettres majuscules comme:
ou use peut utiliser la classe de caractères nommée
[:upper:]
pour représenter toutes les lettres majuscules dans votre courantlocale
:Comme vous l'avez remarqué, tout en utilisant la plage comme
[B-C]
les majuscules et les minuscules pour le même caractère alphabétique sont disposés de manière adjacente (selon l'ordre de classement dulocale
).la source
L'inclusion de caractères «non intuitifs» dans les plages de caractères, comme l'inclusion de lettres minuscules dans une plage dont les limites sont des lettres majuscules, est due au
LC_COLLATE
paramètre local.LC_COLLATE
est censé indiquer l'ordre de tri, mais il le fait mal (le tri des chaînes est plus complexe que ce que les locales peuvent faire) et il vaut mieux s'en passer. Je recommande de supprimerLC_COLLATE
de vos paramètres régionaux. Si vous configurezLANG
, ouLANGUAGE
, ne pas le faire et mettre uniquement ceux dont vous avez besoin:LC_CTYPE
,LC_MESSAGES
,LC_TIME
.Pour plus d'informations sur les paramètres régionaux, voir À quoi dois-je définir mes paramètres régionaux et quelles en sont les implications? et définissez LC_ * mais pas LC_ALL
Pour obtenir des résultats fiables dans un script, quels que soient les paramètres de l'utilisateur, définissez
LC_ALL=C
.la source
Ensemble:
Depuis la page de manuel de bash:
Si vous définissez «globasciiranges», je ne sais pas ce qui arrivera aux caractères non-ascii comme utf-8
la source
echo [cC] * devrait faire ce que vous voulez, de la même façon [A-Za-z] *
Je suis ici parce que la globalisation sur mon système vient de cesser d' être sensible à la casse, donc les charges de mes scripts ne fonctionnent plus comme elles devraient :-(
la source