Команда выполнения ls
на Текущем каталоге и получают вывод:
$ ls
Applications Documents Library Music Public
Desktop Downloads Movies Pictures
Я хотел бы перечислить их как:
1. Applications
2. Desktop
3. Documents
4. Downloads
5. Library
6. Movies
7. Music
8. Pictures
9. Public
Это могло быть достигнуто с помощью less
промежуточным способом
ls | less -N
Как перечислить их простым способом?
Или просто сделайте:
ls -b |nl -s '. ' -w 1
1. a\ file\ with\ nonewline
2. a\ file\ with\nnewline
3. a\ file\ with\ space
4. afile
от man nl
:
-s, --number-separator=STRING
add STRING after (possible) line number
-w, --number-width=NUMBER
use NUMBER columns for line numbers
просто показывание числа имеет место, то у Вас есть несколько опций как после, а также Ваш less -N
путь:
$ ls |cat -n
$ ls |nl
Если бы Вы хотите настроенную выходную нумерацию, то я предложил бы использовать find
и сделайте то, что Вы хотите распечатать:
find . -exec bash -c 'for fnd; do printf "%d. %s\n" "$((++i))" "$fnd"; done ' _ {} +
POSIXly, Вы сделали бы:
find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +
Необходимо передать вывод по каналу ls
к другой команде. Мое предложение состоит в том, чтобы использовать awk
таким образом:
$ ls -b --group-directories-first | awk '{print NR ". " $0}'
1. dir1
2. dir2
3. dir3
4. z-dir1
5. z-dir2
6. z-dir3
7. file1
8. file2
9. file3
10. file4
11. file5
12. file6
13. file7
14. file\nnewline
Обратите внимание на то, что файл file\nnewline
содержит символ новой строки \n
на его имя, которого оставляет опция -b
.
опция --group-directories-first
произведет каталоги перед файлами.
Другой возможный путь состоит в том, чтобы использовать для цикла (но в этом случае поместить каталоги в просьбу списка станет более трудным):
n=1; for i in *; do echo $((n++)). $i; done
Можно также сделать это полностью с коротким сценарием Bash:
#!/bin/bash
set -eu
shopt -s nullglob
[ "$#" -eq 0 ] || cd -- "$1"
i=0
for f in *; do
printf '%d. %s\n' "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt
Можно даже быть необычными и заполнить номер строки больше чем для 9 результатов:
#!/bin/bash
set -eu
shopt -s nullglob
[ "$#" -eq 0 ] || cd -- "$1"
ls=(*)
pad=${#ls[@]}
pad=${#pad}
i=0
for f in *; do
printf '%*d. %s\n' "$pad" "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt
Предположение, что Вы сохранили сценарий как исполняемый файл numbered-ls.sh
в текущем рабочем каталоге:
./numbered-ls.sh [DIRECTORY]
Аргумент DIRECTORY
является дополнительным и значения по умолчанию к текущему рабочему каталогу.
Если сценарий был вызван с изменением аргумента рабочий каталог к пути в первом аргументе.
Соответствуйте всем записям текущего рабочего каталога и просмотрите их. Поскольку каждая запись увеличивает счетчик и печатает его значение наряду с названием записи. Символы разрыва строки от имени записи заменяются ^N
.
Передайте вывод по каналу через cat -vt
иметь дело корректно с именами файлов, которые содержат непечатаемые символы, которые терминал может интерпретировать как управляющие символы.