Перечислите файлы и каталоги с командой 'ls'

Команда выполнения 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

Как перечислить их простым способом?

11
задан 26 March 2018 в 07:59

4 ответа

Или просто сделайте:

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
16
ответ дан 23 November 2019 в 03:51

просто показывание числа имеет место, то у Вас есть несколько опций как после, а также Ваш 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 ' _ {} +
11
ответ дан 23 November 2019 в 03:51

Необходимо передать вывод по каналу 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
13
ответ дан 23 November 2019 в 03:51

Можно также сделать это полностью с коротким сценарием 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 является дополнительным и значения по умолчанию к текущему рабочему каталогу.

Объяснение

  1. Если сценарий был вызван с изменением аргумента рабочий каталог к пути в первом аргументе.

  2. Соответствуйте всем записям текущего рабочего каталога и просмотрите их. Поскольку каждая запись увеличивает счетчик и печатает его значение наряду с названием записи. Символы разрыва строки от имени записи заменяются ^N.

  3. Передайте вывод по каналу через cat -vt иметь дело корректно с именами файлов, которые содержат непечатаемые символы, которые терминал может интерпретировать как управляющие символы.

3
ответ дан 23 November 2019 в 03:51

Другие вопросы по тегам:

Похожие вопросы: