Вопрос или проблема
Это стандартный вывод 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:~$
Потребление первой строки другим способом и передача остального в 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
уитит, неявно печатая строку перед завершением. 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
.
Это заставит 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
Это довольно некрасиво, но, по крайней мере, с реализацией nl
в GNU Coreutils вы можете указывать строки для нумерации через регулярное выражение – так как 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
(по умолчанию, стиль нумерации заголовков — нет).
Вы можете попробовать это с awk
вместо этого:
ls -lh | awk '{printf("%5s ",NR==1?" ":NR-1); print}'
Это напечатает строку “totals” без нумерации, а все оставшиеся строки с номерами, выровненными по правому краю, с шириной поля 5. Пробел между номером и содержимым строки будет составлять два пробела (текст после 5s
в строке формата printf()
); вы можете заменить его чем-то другим, например, \t
.
Если вам не нужна строка “totals”, вы можете использовать
ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'
или
ls -lh | awk 'NR>1 {printf("%5s ",NR-1); print}'
вместо этого.
Можно начать nl с 0, а затем заменить 0 на пробел, используя sed только в первой строке:
% ls -lh | nl -v 0 | sed '1 s,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
Ответ или решение
Если вы хотите, чтобы при использовании команды ls
с нумерацией строк команда nl
начинала нумерацию не с первой строки (чаще всего это строка "total"), а со второй, есть несколько подходов для достижения этой цели.
Теория
Команда nl
в Linux используется для добавления номеров к строкам во входных данных, однако по умолчанию она начинает нумерацию с первой линии. В некоторых случаях, таких как вывод команды ls -lh
, это нежелательно, поскольку слово "total" в первой строке не представляет большого интереса, и нумерация файлов и директорий начинается лишь со второй строки.
Чтобы обойти эту проблему, можно разделить ввод на две части: первая строка, которая вызывается и обрабатывается отдельно, и оставшаяся часть вывода, которая передается команде nl
для автоматической нумерации.
Пример
Давайте взглянем на несколько примеров того, как это можно сделать, используя sed
, awk
и другие утилиты.
-
Использование sed:
Выполнение команды
sed
с использованием модификатора-u
для отключения буферизации позволяет выбрать и обработать первую строку отдельно. Она не будет пронумерована, в то время как остальные строки передаются командеnl
. Пример команды:ls -lh | { sed -u 's/^/ /;q'; nl; }
Здесь
sed
заменяет начало первой строки пробелами и завершает выполнение после первой строки (q
), аnl
обрабатывает и нумерует остальные строки. -
Использование awk:
awk
предоставляет гибкость в управлении выводом и может использоваться для адаптации нумерации строк. Вот один из способов использованияawk
:ls -lh | awk '{printf("%5s ",NR==1?" ":NR-1); print}'
В этом примере первая строка отображается без номера, а последующие строки получают номера, начиная с 1.
-
Замена нулевой строки через sed:
Еще один подход заключается в использовании
nl
для нумерации начиная с нуля и замены первой цифры 0 на пробел с помощьюsed
:ls -lh | nl -v 0 | sed '1 s,0, ,'
Применение
Для использования этих подходов в реальной работе все, что вам нужно, это сохранить команды в файле сценария или использовать их в оболочке командной строки. Эти методы помогут вам организовать вывод ls
так, чтобы нумерация начиналась с полезной информации, что особенно важно при работе с длинными списками файлов и директорий.
Выбранный метод будет зависеть от ваших предпочтений и особенностей операционной системы, так как некоторые из команд могут иметь отличия в разных дистрибутивах Linux. Обратите внимание, что некоторые команды могут требовать дополнительных прав доступа или предварительных настроек для корректной работы. Например, использование awk
может потребовать немного большего понимания для точной настройки вывода, особенно если требуется кастомизация формата строки.
Эти методы предоставляют гибкость и удобство в управлении выводом команд, помогая сделать вашу работу более эффективной и упрощая анализ и чтение результатов командной строки. В зависимости от конкретного случая, вы можете адаптировать их под свои нужды, обеспечивая наиболее удобный и читаемый формат отображения данных.