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


11

Запустите Command lsв Current Directory и получите вывод:

$ 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 для одной из команд в ответах; во втором создайте новый псевдоним - скажите «lsn» команде.
jamesqf

Ответы:


16

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

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

13

Вы должны направить вывод 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выведет каталоги перед файлами.

Другой возможный способ - использовать цикл for (но в этом случае разместить каталоги в начале списка станет сложнее):

n=1; for i in *; do echo $((n++)). $i; done

11

если показывается только число, то у вас есть несколько вариантов, а также ваш 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 ' _ {} +

В этом случае iнеобходимо заранее инициализировать:i=0; find ...
rexkogitans

это не обязательно здесь, так как -exec sh -c '....' работает под отдельной оболочкой sh.
αғsнιη

3

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.