Перерахуйте файли та каталоги командою 'ls'


11

Запустіть команду 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 до однієї з команд у відповідях; у другому створіть новий псевдонім - скажіть команді "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виведе каталоги перед файлами.

Ще один можливий спосіб - це використання для циклу (але в цьому випадку розміщення каталогів у випробовуванні списку стане складніше):

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.
αғsnιη

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.