
Это стандартный выводls -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:~$
Вместо того, чтобы начинать номер с total 24
, можно ли начать его с фактического файла/каталога, который находится во второй строке?
Желаемый результат
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:~$
решение1
Используйте первую строку вместе с чем-то другим, а остальное передайтеnl
$ 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
(с -u
отключением буферизации), будет потреблять одну строку и q
uit, неявно печатая строку перед завершением. nl
потребляет оставшиеся строки.
Если вы действительно хотите сделать отступ в первой строке, это можно сделать следующим образом:
$ 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
Если вы хотите начать нумерацию строк дальше, укажите, sed
когда это нужно q
сделать:
$ 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
Вы также можете использовать что-то вроде /\.\.$/q
вместо 3q
.
решение2
Это запустит nl
начало с 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
решение3
Это немного некрасиво, но, по крайней мере, с реализацией GNU Coreutils nl
вы можете указать строки, которые нужно пронумеровать, с помощью регулярного выражения, поскольку t
это не один из возможных типов файлов в ls
выводе длинного списка.1ты мог бы сделать
ls -lh | nl -bp'^[^t]'
К сожалению, это не сохраняет выравнивание выходных данных.
Возможно, наиболее формально правильным подходом будет разделение ls
вывода на отдельные разделы заголовка и тела:
$ 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
(по умолчанию стиль нумерации заголовковникто).
решение4
Вместо этого вы можете попробовать awk
:
ls -lh | awk '{printf("%5s ",NR==1?" ":NR-1); print}'
Это напечатает строку «итоговые данные» без ее нумерации и все остальные строки с числами, выровненными по правому краю, с шириной поля 5. Расстояние между числом и содержимым строки будет составлять два пробела (текст после 5s
в printf()
строке формата); вы можете заменить его чем-то другим, например \t
.
Если вам не нужна строка «итого», вы можете использовать
ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'
или
ls -lh | awk 'NR>1 {printf("%5s ",NR-1); print}'
вместо.