Esta es una pregunta de tarea:
Haga coincidir todos los nombres de archivo con 2 o más caracteres que comiencen con una letra minúscula, pero no terminen con una letra mayúscula.
No entiendo por qué mi solución no funciona.
Entonces ejecuté lo siguiente:
touch aa
touch ha
touch ah
touch hh
touch a123e
touch hX
touch Ax
ls [a-z]*[!A-Z]
Salida:
aa ha
Mi pregunta: ¿Por qué no coincide con "ah", "hh" o "a123e"?

mkshshell, pero nobash --posix, así que debe haber alguna regla específica para bash`mkshal igual quezsh's[A-Z]no coincide con elÉ, por ejemplo. Los[A-Z]partidos de ksh93 están encendidosÉpero no encendidosh.Respuestas:
Este es un problema local . En su configuración regional, se
[A-Z]expande a algo como[AbBcZ...zZ](más probablemente otros como caracteres acentuados), por[^A-Z]lo tanto, en realidad significa "archivos que terminan cona" en su ejemplo (y solo en su ejemplo).Si desea evitar tal sorpresa, una forma es establecerla,
LC_COLLATE=Cya que la clasificación es la parte de la configuración regional que es responsable del orden de clasificación. Además, vacíeLC_ALLsi está configurado, ya que tendría prioridad.O, mejor, probablemente sea preferible no cambiar la configuración regional y usar las clases apropiadas: en
[:lower:]lugar de[a-z]y en[:upper:]lugar de[A-Z].O use la
globasciirangesopción de bash :fuente
LC_ALL=C ls [a-z]*[^A-Z]solo afectaríalsla configuración regional, no la configuración regional utilizada por el shell para expandir el globo o analizar esa línea de comando.LC_xxxpara que se aplique al glob, pero sería preferible para que ls obtenga la misma configuración regional.test-鏏por ejemplo, porque una vez que cambia el juego de caracteres al de la configuración regional C, se鏏convierte en<0xe7>A. IOW, al cambiar LC_CTYPE, obtienes diferentes caracteres.é,Á(pero probablemente noŹ). IOW, usar[A-Z]tiene poco sentido fuera de la configuración regional C.