
Esta es la salida estándar dels -ln | nl
wolf@linux:~$ ls -lh | nl
1 total 24
2 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
3 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
4 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
wolf@linux:~$
En lugar de comenzar el número desde total 24
, ¿sería posible comenzar desde el directorio/archivos reales, que es la segunda línea?
Salida deseada
wolf@linux:~$ ls -lh | nl
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
wolf@linux:~$
Respuesta1
Consume la primera línea con algo más y pasa el resto anl
$ ls -lh | { sed -u q; nl; }
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
sed
(con -u
para deshabilitar el almacenamiento en búfer), consumirá una línea y q
uit, implícitamente imprimirá la línea antes de la terminación. nl
consume el resto de líneas.
Si realmente desea sangrar la primera línea, puede hacerlo así:
$ ls -lh | { sed -u 's/^/ /;q'; nl; }
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
Si desea comenzar la numeración de líneas más abajo, indique sed
cuándo debe q
aparecer:
$ ls -alh | { sed -u 's/^/ /;3q'; nl; }
total 24
drwx------ 1 wolf wolf 186 Sep 24 22:18 .
drwx------ 1 wolf wolf 186 Sep 24 22:18 ..
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
También puedes usar algo como /\.\.$/q
en lugar de 3q
.
Respuesta2
Esto hará que nl
comience desde 0:
$ ls -lh | nl -v 0
0 total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
Respuesta3
Es un poco feo, pero al menos con la implementación de GNU Coreutils nl
puedes especificar las líneas que se numerarán mediante una expresión regular, ya que t
no es uno de los tipos de archivos posibles en la ls
salida de la lista larga.1Podrías hacerlo
ls -lh | nl -bp'^[^t]'
Desafortunadamente, esto no preserva la alineación de salida.
Quizás el enfoque más formalmente correcto sea separar la ls
salida en distintas secciones de encabezado y cuerpo:
$ ls -lh | sed -e '1s/.*/\\:\\:\\:\n&\n\\:\\:/' | nl
total 0
1 -rw-rw-rw- 1 steeldriver steeldriver 0 Sep 9 19:53 bar
2 -rw-r--r-- 1 steeldriver steeldriver 449 Sep 16 17:41 bash_envs
3 -rw-rw-rw- 1 steeldriver steeldriver 131 Sep 5 18:13 dirlist
4 -rw-r--r-- 1 steeldriver steeldriver 359 Sep 13 19:42 error_status
(de forma predeterminada, el estilo de numeración del encabezado esninguno).
Respuesta4
Podrías probarlo con awk
:
ls -lh | awk '{printf("%5s ",NR==1?" ":NR-1); print}'
Esto imprimirá la línea de "totales" sin numerarla, y todas las líneas restantes con números, ajustadas a la derecha, con un ancho de campo de 5. El espacio entre el número y el contenido de la línea será de dos espacios (el texto después de 5s
en la printf()
cadena de formato ); puedes reemplazarlo con algo más como \t
.
Si no necesita la línea "totales", puede usar
ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'
o
ls -lh | awk 'NR>1 {printf("%5s ",NR-1); print}'
en cambio.