
Esta é a saída padrão 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:~$
Em vez de iniciar o número em total 24
, seria possível iniciá-lo a partir dos arquivos/diretórios reais, que são a segunda linha?
Saída desejada
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:~$
Responder1
Consumir a primeira linha com outra coisa e passar o resto paranl
$ 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
(com -u
para desabilitar o buffer), consumirá uma linha e q
sairá, imprimindo implicitamente a linha antes do término. nl
consome o resto das linhas.
Se você realmente deseja que a primeira linha seja recuada, você pode fazer assim:
$ 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
Caso queira iniciar a numeração das linhas mais abaixo, diga sed
quando q
usar:
$ 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
Você também pode usar algo como /\.\.$/q
em vez de 3q
.
Responder2
Isso fará com que nl
comece do 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
Responder3
É meio feio, mas pelo menos com a implementação do GNU Coreutils nl
você pode especificar as linhas a serem numeradas por meio de uma expressão regular - já que t
não é um dos tipos de arquivo possíveis na ls
saída da lista longa1você poderia fazer
ls -lh | nl -bp'^[^t]'
Infelizmente, isso não preserva o alinhamento da saída.
Talvez a abordagem formalmente mais correta seja separar a ls
saída em seções distintas de cabeçalho e corpo:
$ 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
(por padrão, o estilo de numeração do cabeçalho énenhum).
Responder4
Você poderia tentar com awk
:
ls -lh | awk '{printf("%5s ",NR==1?" ":NR-1); print}'
Isto irá imprimir a linha "totais" sem numerá-la, e todas as linhas restantes com números, ajustadas à direita, com uma largura de campo de 5. O espaço entre o número e o conteúdo da linha será de dois espaços (o texto após o 5s
na printf()
string de formato ); você pode substituí-lo por algo como \t
.
Se você não precisa da linha "totais", você pode usar
ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'
ou
ls -lh | awk 'NR>1 {printf("%5s ",NR-1); print}'
em vez de.