Ваша команда бессмысленна. Прежде всего, 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
Когда вы вводите не -имя установленной программы, это не dnf
ее установка, а PackageKit и ее команда не найдена плагин (пакетPackageKit-command-not-found
). PackageKit использует PolicyKit, чтобы решить, запрашивать ли пароль при выполнении привилегированных задач или нет, а локальным активным пользователям-администраторам не нужно указывать пароль для установки пакета (это не специфичная функция Fedora, она получена от usptream, см. это Обсуждение FESCO). По той же причине вам не нужно вводить пароль при установке или обновлении пакетов из инструментов с графическим интерфейсом, таких как GNOME Software, которые также используют PackageKit в качестве серверной части.
Вы также можете использовать PackageKit из командной строки, команда pkcon
и pkcon install <package>
также не будет запрашивать пароль.
А зачем dnf
нужно sudo
? Он просто не использует PolicyKit.
В описанном вами сценарии «вы» не устанавливаете установленный пакет -служба PackageKit (, которая уже запущена с правами root ), выполняет установку на вашем от имени. PackageKit использует PolicyKit, чтобы определить, кому разрешено или кому запрещено устанавливать пакеты -. Если вы не хотите, чтобы непривилегированные пользователи могли устанавливать программное обеспечение, вы можете изменить политику PolicyKit, чтобы запретить это. Одна из причин существования PackageKit заключается в том, что пользователю не нужно знать подробности системы управления пакетами в любом дистрибутиве, который он использует (, будь то dnf
, или yum
, или apt
, или pacman
или что-то еще )-, им просто нужно попросить PackageKit установить пакет,и PackageKit занимается деталями управления пакетами и их установкой в этом конкретном дистрибутиве. Когда вы вручную используете dnf
для установки пакета в Fedora, вы напрямую взаимодействуете с системой управления пакетами -PackageKit не выполняет эту операцию от вашего имени -, поэтому вам нужно работать как root (или укажите пароль root )для установки пакетов на этом уровне. Но, как обычный пользователь, вы можете использовать pkcon install <packagename>
, чтобы попросить PackageKit выполнить установку от вашего имени (, если системная политика, настроенная в PolicyKit, позволяет вам сделать это ), даже не запуская как root (через su
или sudo
и т. д. ), или ввод пароля root.
Поведение, о котором вы говорите, когда вам предлагается установить пакет, если вы пытаетесь запустить что-то в командной строке, предоставленное пакетом, который вы еще не установили, управляется пакетом под названием " PackageKit -команда -не -найдена ". Я абсолютно ненавижу такое поведение, и одна из самых первых вещей, которые я делаю в любой недавно установленной системе Linux, — это удаление пакета PackageKit-command-not-found
, чтобы этого не было сделано....