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

adduser и usermod - это две разные утилиты, которые имеют общий факт, что оба могут добавить пользователя в группу.

Согласно man adduser

является более дружественным передним концом инструментам низкого уровня, таким как программы useradd, groupadd и usermod.

Дополнительная информация:

man adduser: adduser, addgroup - добавить пользователя или группу к системному человеку usermod: usermod - изменить учетную запись пользователя [!d7 ]
11
задан 26 March 2018 в 17:59

12 ответов

Или просто выполните:

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
ответ дан 22 May 2018 в 11:46

Или просто выполните:

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
ответ дан 17 July 2018 в 18:04

Или просто выполните:

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 July 2018 в 18:55

Вы должны передать вывод 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
ответ дан 22 May 2018 в 11:46

, если просто указывать номер, то у вас есть несколько вариантов, как показано ниже, а также ваш 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
ответ дан 22 May 2018 в 11:46
  • 1
    В этом случае i необходимо предварительно инициализировать: i=0; find ... – rexkogitans 26 March 2018 в 18:07
  • 2
    это не обязательно здесь, так как -exec sh -c '....' работает под отдельной оболочкой sh. – αғsнιη 27 March 2018 в 07:17

Вы также можете сделать это полностью с помощью короткого сценария 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
[d2 ] Использование

Предполагая, что вы сохранили скрипт как исполняемый файл numbered-ls.sh в текущем рабочем каталоге:

./numbered-ls.sh [DIRECTORY]

Аргумент DIRECTORY является необязательным и по умолчанию используется текущий рабочий каталог.

Объяснение

Если скрипт был вызван с аргументом, измените рабочий каталог на путь в первом аргументе. Совместите все записи текущего рабочего каталога и просмотрите их. Для каждого входа добавьте счетчик и распечатайте его значение вместе с именем записи. Символы разрыва строки в имени записи заменяются на ^N. Выполните вывод через cat -vt, чтобы грамотно обрабатывать имена файлов, которые содержат непечатаемые символы, которые терминал может интерпретировать как управляющие символы.
3
ответ дан 22 May 2018 в 11:46

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

, если просто указывать номер, то у вас есть несколько вариантов, как показано ниже, а также ваш 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
ответ дан 17 July 2018 в 18:04

Вы должны передать вывод 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
ответ дан 17 July 2018 в 18:04

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

, если просто указывать номер, то у вас есть несколько вариантов, как показано ниже, а также ваш 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 July 2018 в 18:55
  • 1
    В этом случае i необходимо предварительно инициализировать: i=0; find ... – rexkogitans 26 March 2018 в 18:07
  • 2
    это не обязательно здесь, так как -exec sh -c '....' работает под отдельной оболочкой sh. – αғsнιη 27 March 2018 в 07:17

Вы должны передать вывод 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 July 2018 в 18:55

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

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