![Ordenar carpetas en Unix comenzando con el segundo carácter](https://rvso.com/image/168780/Ordenar%20carpetas%20en%20Unix%20comenzando%20con%20el%20segundo%20car%C3%A1cter.png)
Estoy intentando ordenar la lista de directorios comenzando con el segundo carácter.
Por ejemplo, si hago el código siguiente, la lista de directorios está en orden según el primer carácter.
$ ls -1d */
lrodriguez/
mreynolds/
yalberto/
Lo que quiero lograr es mostrarlos como:
yalberto/
mreynolds/
lrodriguez/
He mirado el siguiente foro: ¿Cómo ordenar archivos por parte del nombre del archivo? pero no tuvo éxito.
Intenté algo como: ls -1d -- *?[a-z]* | sort -t?[a-z] -k2
pero no obtuve ningún resultado. Bastante nuevo en el entorno Unix y cualquier sugerencia será muy útil. Gracias de antemano.
Respuesta1
Con sort
, puedes usar una clave del formularioF.C
para especificar la posición de un carácterdentroun campo. Así por ejemplo
$ printf '%s\n' */ | sort -k1.2
yalberto/
mreynolds/
lrodriguez/
Tenga en cuenta que esto fallará si alguno de los nombres de directorio contiene una nueva línea.
Esto podría solucionarse con GNU sort
trabajando con registros delimitados por NUL en lugar de con:
printf '%s\0' */ | sort -zk1.2 | tr '\0' '\n'
También tenga en cuenta que la expansión de */
también incluye enlaces simbólicos a directorios.
Respuesta2
Con zsh
:
print -rC1 -- *(N/oe['REPLY=${REPLY#?}'])
print -rC1
imprime sus argumentosr
aw en1
C
la columna*(qualifiers)
: glob con calificadores globN
:N
ullglob: se expande a nada si no hay coincidencias/
: solo seleccione archivos de tipodirectoriooe[expression]
:o
ordene la lista según el resultado de lae
expresión (del valor que$REPLY
contiene inicialmente el nombre del archivo después de haber sido manipulado por la expresión)REPLY=${REPLY#?}
: elimina el primer carácter del nombre del archivo.
También es posible que desee agregar el primer carácter al final, como con , para REPLY=${REPLY#?}.$REPLY[1]
que ordene en ese orden en lugar de aleatoriamente.asmith
bsmith
csmith