Ordenar carpetas en Unix comenzando con el segundo carácter

Ordenar carpetas en Unix comenzando con el segundo carácter

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] -k2pero 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 sorttrabajando 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 -rC1imprime sus argumentos raw en 1 Cla columna
  • *(qualifiers): glob con calificadores glob
  • N: Nullglob: se expande a nada si no hay coincidencias
  • /: solo seleccione archivos de tipodirectorio
  • oe[expression]: oordene la lista según el resultado de la eexpresión (del valor que $REPLYcontiene 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.asmithbsmithcsmith

información relacionada