¿Cómo ordenar una lista de archivos tipo ls?

0

¿Cómo ordeno por la última columna una lista que se ve así:

drwxr-sr-x   2 user     group           4096 2018-02-19 14:11:42  /something/project/somefile
drwxr-sr-x   2 user     group           4096 2018-02-19 00:14:50  /blah-blah/anything
-rw-r-----   1 someone  users           2188 2018-07-21 13:52:59  /aaa/222
drwxr-S---   2 someone  users           4096 2018-06-25 14:27:42  /bbb/333/anything/whatever
-rw-r-----   1 someone  users            715 2018-06-16 20:09:58  /xxx/aaa/666

* La lista está en un archivo pero no se genera por lslo que no puedo usar la funcionalidad de ls.

Jorge
fuente

Respuestas:

2

Puedes usar sort:

sort -k8,8 <<EOF
drwxr-sr-x   2 user     group           4096 2018-02-19 14:11:42  /something/project/somefile
drwxr-sr-x   2 user     group           4096 2018-02-19 00:14:50  /blah-blah/anything
-rw-r-----   1 someone  users           2188 2018-07-21 13:52:59  /aaa/222
drwxr-S---   2 someone  users           4096 2018-06-25 14:27:42  /bbb/333/anything/whatever
-rw-r-----   1 someone  users            715 2018-06-16 20:09:58  /xxx/aaa/666
EOF

-kselecciona en qué campo ordenar, 8,8dice ordenar los datos del campo 8 al campo 8.

Puede usar -tpara definir el separador de campo, aunque el valor predeterminado aquí está bien (transición de no vacío a blanco).

Salida:

-rw-r-----   1 someone  users           2188 2018-07-21 13:52:59  /aaa/222
drwxr-S---   2 someone  users           4096 2018-06-25 14:27:42  /bbb/333/anything/whatever
drwxr-sr-x   2 user     group           4096 2018-02-19 00:14:50  /blah-blah/anything
drwxr-sr-x   2 user     group           4096 2018-02-19 14:11:42  /something/project/somefile
-rw-r-----   1 someone  users            715 2018-06-16 20:09:58  /xxx/aaa/666

Para el seguimiento, usted preguntó:

Mi archivo que contiene la lista también tiene N líneas iniciales y M finales que no están en la forma de columna que se muestra arriba. Lamentablemente, la clasificación los arruina. ¿Cómo puedo excluir esas líneas y ordenar solo las columnas?

Necesitará saber cuántas líneas hay antes / dentro / después del bloque que se va a ordenar, y puede sustituir los valores utilizados a continuación con variables. Una tubería simple como se muestra a continuación puede funcionar bien.

Contenido de data.txt:

Zline1
Zline2
drwxr-sr-x   2 user     group           4096 2018-02-19 14:11:42  /something/project/somefile
drwxr-sr-x   2 user     group           4096 2018-02-19 00:14:50  /blah-blah/anything
-rw-r-----   1 someone  users           2188 2018-07-21 13:52:59  /aaa/222
drwxr-S---   2 someone  users           4096 2018-06-25 14:27:42  /bbb/333/anything/whatever
-rw-r-----   1 someone  users            715 2018-06-16 20:09:58  /xxx/aaa/666
AlineN-1
AlineN

Tubería:

(head -n 2; head -n 5 | sort -k8,8; cat) < data.txt

Salida:

Zline1
Zline2
-rw-r-----   1 someone  users           2188 2018-07-21 13:52:59  /aaa/222
drwxr-S---   2 someone  users           4096 2018-06-25 14:27:42  /bbb/333/anything/whatever
drwxr-sr-x   2 user     group           4096 2018-02-19 00:14:50  /blah-blah/anything
drwxr-sr-x   2 user     group           4096 2018-02-19 14:11:42  /something/project/somefile
-rw-r-----   1 someone  users            715 2018-06-16 20:09:58  /xxx/aaa/666
AlineN-1
AlineN
Attie
fuente
¡Gracias! También puedo preguntar: mi archivo que contiene la lista también tiene N líneas iniciales y M finales que no están en la forma de columna que se muestra arriba. Lamentablemente, la clasificación los arruina. ¿Cómo puedo excluir esas líneas y ordenar solo las columnas?
George
1
Vea mi actualización :-)
Attie
¡Gracias! En realidad, descubrí que (head -n <N>; tail -n +<N+1> | head -n -<M> | sort -s -k8,8; tail -n <M>) < data.txttambién funciona (sin tener que saber el número de líneas en el "medio"). Desafortunadamente Mfaltan las últimas líneas, así que tuve que hacerlo como una línea separada en el guión. Quizás si sabes cómo canalizarlo (ya que puedo estar equivocado) sería perfecto :) ¡Pero esto también funciona!
George
El uso tailno funcionará, ya que tiene que leer la entrada completa para calcular cuántas líneas del final usar ... así que, en ese caso, la final tail -n <M>no se activa stdin, ¡porque la anterior lo tail -n +<N+1>ha tomado todo!
Attie