Normalmente, el golpeteo de bash distingue entre mayúsculas y minúsculas:
$ 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
El uso de corchetes no parece cambiar esto:
$ 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
Todavía no lo cambia si se usa un guión:
$ 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
Pero las letras están intercaladas:
$ 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
Esto sugiere que el guión está usando un orden local, "AaBbCcDd". Entonces: ¿hay alguna forma de glob para todos los archivos que comienzan con una letra mayúscula?
[A-Z]
coincide con letras minúsculas en bash?Respuestas:
En bash versión 4.3 y posterior, hay una opción de shopt llamada
globasciiranges
:Según las páginas de manual de Shopt Builtin GNU :
Como resultado puedes
Úselo
shopt -u
para deshabilitar.Otra forma es cambiar la configuración regional a C. Puede hacerlo temporalmente usando una subshell:
Obtendrá los resultados que necesita, y cuando el subconjunto finalice, la configuración regional del intérprete principal no cambiará a lo que era antes.
Otra alternativa es en lugar de
[A-Z]
usar la expansión de llaves{A..Z}
junto con lanullglob
opción bash shopt.Al habilitar la
nullglob
opción, si un patrón no coincide durante la expansión del nombre de ruta, se devuelve una cadena nula en lugar del patrón en sí.Como resultado, este funcionará como se esperaba:
fuente
[[:upper:]]
porque en realidad solo quiero parte del alfabeto, pero esto funciona.man bash
en su terminal y buscar (usando/
) para globasciiranges.LC_ALL=C printf '%s\n' [A-Z]*
funcionaría para su segunda solución, sin una subshell? Por cierto: hay un error tipográfico:nullblog
pero hay muy pocos caracteres para que pueda corregirlo.Puede escribir todas las letras mayúsculas muy bien como:
o use puede usar la clase de caracteres nombrada
[:upper:]
para representar todas las letras mayúsculas en su actuallocale
:Como habrás notado, mientras usas el rango,
[B-C]
las mayúsculas y minúsculas para el mismo carácter alfabético se organizan de forma adyacente (de acuerdo con el orden de clasificación dellocale
)fuente
La inclusión de caracteres "no intuitivos" en los rangos de caracteres, como la inclusión de letras minúsculas en un rango cuyos límites son letras mayúsculas, se debe a la
LC_COLLATE
configuración regional.LC_COLLATE
se supone que indica el orden de clasificación, pero hace un mal trabajo (la clasificación de cadenas es más compleja de lo que pueden hacer las configuraciones regionales) y es mejor sin ella. Recomiendo eliminarLC_COLLATE
de su configuración regional. Si está configurandoLANG
, oLANGUAGE
, no hacer eso y establecer sólo los que necesita:LC_CTYPE
,LC_MESSAGES
,LC_TIME
.Para obtener más información sobre las configuraciones regionales, consulte ¿En qué debo configurar mi configuración regional y cuáles son las implicaciones de hacerlo? y establezca LC_ * pero no LC_ALL
Para obtener resultados confiables en un script, independientemente de la configuración del usuario, establezca
LC_ALL=C
.fuente
Conjunto:
Desde la página de manual de bash:
Si establece 'globasciiranges', no sé qué pasará con los personajes que no son ascii como utf-8
fuente
echo [cC] * debe hacer lo que quiera, de manera similar [A-Za-z] *
Estoy aquí porque el bloqueo en mi sistema ha dejado de ser sensible a mayúsculas y minúsculas, por lo que muchos de mis scripts ya no funcionan como deberían :-(
fuente