En Bash, ¿están garantizadas las expansiones comodín?


54

¿Se garantiza que la expansión de un comodín en Bash esté en orden alfabético? Me veo obligado a dividir un archivo grande en piezas de 10 Mb para que puedan ser aceptadas por mi repositorio de Mercurial.

Entonces pensé que podría usar:

split -b 10485760 Big.file BigFilePiece.

y luego en lugar de:

cat BigFile | bigFileProcessor

Yo podría hacer:

cat BigFilePiece.* | bigFileProcessor

en su lugar.

Sin embargo, no pude encontrar ningún lugar que garantizara que la expansión del asterisco (también conocido como comodín *) siempre estaría en orden alfabético, por lo que .aaocurrió antes .ab(en lugar de ser un orden de marca de tiempo o algo así).

Además, ¿hay fallas en mi plan? ¿Qué tan grande es el costo de rendimiento de catreunir el archivo?


44
Seguro que estás tomando el enfoque equivocado. Si el administrador establece un límite para el tamaño de los archivos que tiene en el repositorio, entonces debe hablar con él. Hablando de expansión: siempre he visto que la expansión es alfanumérica.
Mircea Vutcovici

1
Siempre puede canalizar sortsi necesita alguna manipulación de pedido adicional.
Warner

2
Tenga en cuenta que Mercurial puede administrar archivos de cualquier tamaño, limitados por la cantidad de RAM que tenga. Recibirá una advertencia si agrega un archivo grande, ya que Mercurial supone que puede contener el archivo en la memoria. Para las fusiones, Mercurial necesita mantener dos archivos en la memoria. Por lo tanto, las máquinas con pequeñas cantidades de RAM pueden tener problemas para verificar el archivo. Lo acabo de probar, y hg commiten un Narchivo MB requiere aproximadamente 3 * NMB de RAM y hg updaterequiere aproximadamente 2 * NMB de RAM. Esto es con Mercurial 1.5 en Linux.
Martin Geisler

Respuestas:


67

Sí, la expansión global es alfabética.

Desde la manpágina Bash :

Expansión de nombre de ruta

Después de la división de palabras, a menos que la -fopción ha sido activa, bash examina cada palabra de los personajes *, ?y [. Si aparece uno de estos caracteres, la palabra se considera un patrón y se reemplaza por una lista ordenada alfabéticamente de nombres de archivos que coinciden con el patrón.


@ Dennis Williamson, ¿Alguna idea de si esto seguiría siendo cierto si un usuario tiene un conjunto de idiomas diferente?
Zoredache

55
@Zoredache: POSIX lo especifica en realidad: opengroup.org/onlinepubs/007908775/xsh/glob.html "Los nombres de ruta están en orden de clasificación según la configuración actual de la categoría LC_COLLATE, consulte la especificación XBD, LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd / ... "y es por eso que debes hacer cosas como en ls -l [[:lower:]]lugar de ls -l [a-z].
Dennis Williamson

Tenga en cuenta que el orden es alfabético, por lo que BigFilePiece.10 vendrá antes de BigFilePiece.2
Ken

@DennisWilliamson - ¿Por qué dos pares de corchetes? Uno parece funcionar exactamente igual para mí.
ArtOfWarfare

2
@ArtOfWarfare: Prueba esto: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. El archivo "z" solo aparece en una lista por el segundo lsporque está pidiendo nombres de archivo de una letra en minúscula. El primero ls, el que no tiene corchetes externos, es pedir nombres de archivo de un solo carácter de la lista de caracteres ":", "l", "o", "w", "e" y "r". En ambos casos, los corchetes más externos delimitan una expresión de corchete que enumera caracteres y clases. En el caso de [[:lower:]], los corchetes internos, los dos puntos y la palabra nombran una clase de caracteres. ...
Dennis Williamson

4

Es un comportamiento documentado para bashque pueda depender de él en sus scripts. También ha sido cierto para otros shells compatibles con Bourne durante mucho tiempo ... aunque puede haber casos de esquina con respecto al plegado de mayúsculas o caracteres no alfanuméricos.

(La lista resultante, en bash, estará en un orden casi "ASCII-betical" --- excepto que las letras minúsculas y mayúsculas se clasificarán juntas como si no hubiera diferencias entre mayúsculas y minúsculas antes de sus equivalentes en mayúsculas. -alfabetics deben clasificarse en el mismo orden que aparecen en ASCII).

Como otros han señalado, esto podría verse afectado por la configuración del entorno relacionado con el idioma: LANG en general y LC_COLLATE más específicamente. Es posible que sea más seguro ejecutar comandos que dependen del orden de expansión global bajo un envcomando para limpiar el entorno (utilizando -io -usegún corresponda) o canalizar los resultados sortpara garantizar una secuencia sólida.


44
Parece que todos los no alfanuméricos se ignoran en el proceso de clasificación. Por lo tanto, "=", "_", "~" no se puede usar para forzar a un archivo a iniciar o finalizar (respectivamente) la lista.
Oteo

3

Si bien las expansiones glob están ordenadas alfabéticamente, también obedecen a la configuración del idioma del caparazón.

Asegúrese de establecer esto en "C" en su secuencia de comandos si tiene la intención de que sea portátil.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.