Используя команды cd и ls, вы получите дерево вашей UNIX-машины глубиной в 2 подкаталога, начиная с корня "/". Если количество файлов или каталогов больше 20, укажите только количество файлов или подкаталогов.

Я пробовал это до сих пор:

cd /../.. | ls -l | wc -l

Но я действительно не знаю, дает ли это мне то, что мне нужно. Я знаю ВК. будет подсчитывать количество файлов, но я этого не понял. cd/../../, так как похоже, что я спускаюсь на два уровня ниже. Ну, это выглядит запутанно.

0
steve 14 Окт 2019 в 00:28
Не могли бы вы опубликовать, что вы пробовали? И, пожалуйста, скажите нам, если это домашнее задание.
 – 
fd0
13 Окт 2019 в 22:06
Я не совсем понял эту вещь о более чем 20 каталогах или файлах. Это какое-то общее количество 2-го уровня каталога или в любом отдельном каталоге на этом уровне (рекурсивно?)? Вы имеете в виду «выход», когда пишете «указать»? Кроме того, wc -l никогда не считает файлы. Он считает только строки текста. Если имена файлов содержат символы новой строки, они будут учитываться несколько раз wc -l.
 – 
Kusalananda
13 Окт 2019 в 22:16
Wc, связанный с ls -l через конвейер, будет подсчитывать количество файлов. команда должна отображать количество файлов. все подкаталоги уровня 2 с их количеством файлов.
 – 
SAM.Am
13 Окт 2019 в 22:21
wc -l не считает файлы. Он считает строки. Попробуйте создать пустой каталог, а затем запустите в нем touch $'one\nfile'. ls -l | wc -l даст вам 3 (2 для файла и один для заголовка, который он всегда выводит при использовании вывода в длинном формате).
 – 
Kusalananda
13 Окт 2019 в 22:24

1 ответ

Лучший ответ

Ваша команда бессмысленна. Прежде всего, cd /../.. аналогичен cd /, то есть он просто изменит текущий рабочий каталог на самый верхний каталог в иерархии каталогов. Во-вторых, cd не производит никакого вывода, так что передача его чему угодно не принесет много пользы.

В-третьих, ls -l создаст список записей (имен) в текущем каталоге. Вы используете wc -l для подсчета количества строк в выводе ls -l. Это число, вероятно, как минимум на единицу больше, чем реальное количество записей каталога в любом каталоге, поскольку ls -l выводит своего рода заголовок (BSD ls не делает этого для пустого каталоги, но GNU ls всегда так делает). ls -l не будет перечислять скрытые имена файлов и будет (при передаче в wc -l) создавать несколько строк для файлов, в именах которых есть символы новой строки .

Не используйте ls ни для чего, кроме как для просмотра списков каталогов (глазами), и используйте wc -l только для подсчета строк. Есть более умные и быстрые способы подсчета файлов.

Связанный:


Чтобы перечислить количество записей каталога (имен) во всех подкаталогах 2-го уровня, используя bash, используйте что-то вроде

shopt -s nullglob dotglob

for dirpath in /*/*/; do
    set -- "$dirpath"/*
    printf '%d\t%s\n' "$#" "$dirpath"
done

Это зацикливается на всех каталогах 2-го уровня. Для каждого каталога он расширяет шаблон подстановки * в каталоге и устанавливает позиционные параметры для полученных имен. После этого специальная переменная $# будет содержать количество позиционных параметров (имен в справочнике). Затем мы печатаем путь к каталогу вместе с этим счетчиком.

Сначала устанавливаются параметры оболочки nullglob и dotglob, чтобы мы правильно подсчитывали скрытые имена и получали правильное количество (0) для пустых каталогов.

Хотели бы вы иметь рекурсивный подсчет каждого подкаталога на уровне 2:

shopt -s nullglob dotglob globstar

for dirpath in /*/*/; do
    set -- "$dirpath"/**/*
    printf '%d\t%s\n' "$#" "$dirpath"
done

Параметр оболочки globstar в bash позволяет использовать **, который представляет собой шаблон, который "рекурсивно" сопоставляется с подкаталогами.

Хотели бы вы перечислить только те, в которых 20 или более записей (здесь используется второй вариант сверху, который рекурсивно подсчитывает имена в каждом подкаталоге):

shopt -s nullglob dotglob globstar

for dirpath in /*/*/; do
    set -- "$dirpath"/**/*
    if [[ $# -ge 20 ]]; then
        printf '%d\t%s\n' "$#" "$dirpath"
    fi
done
0
Kusalananda 13 Окт 2019 в 23:04