Как я могу распечатать размеры файла рекурсивно, сообщив об ошибках разрешения?

Я должен сделать сценарий, который печатает размеры всех .conf файлы от /etc рекурсивно в указанном файле, и это печатает ошибки, вызванные отсутствием разрешения в другом файле. Я не знаю, как сделать его. Любое предложение было бы очень полезно.

-4
задан 24 November 2019 в 12:27

3 ответа

Можно использовать -fprintf записать вывод из find в файл.

$ find /etc -type f,l -name '*.conf' \
    -fprintf ~/filelist '%s %p\n' 2> ~/error.log

найдите опции:

  • -type f,l Поиск регулярных файлов и символьной ссылки.
  • -name Соответствуйте основе имени файла с шаблоном соответствия оболочки.
  • -fprintf Как-printf, но вывод записей в файл вместо этого.

формат fprintf:

  • %s Размер файла в байтах.
  • %p Имя файла (с включенной отправной точкой).
  • \n Новая строка.

Bash:

  • [n]>file Перенаправьте дескриптор файла [n] в "файл".
  • ~ Расширяется до значения параметра оболочки ДОМОЙ.
  • \ Повреждается длинные линии в несколько строк.
1
ответ дан 21 December 2019 в 23:56

Можно использовать bash globstar опция:

Если установлено, шаблон ** используемый в контексте расширения пути будет соответствовать всем файлам и нулю или большему количеству каталогов и подкаталогов. Если шаблон сопровождается/, только соответствие подкаталогов и каталоги.

Установите его с:

shopt -s globstar

После этого можно соответствовать любому .conf файл под /etc с /etc/{,**/}*.conf, таким образом, теперь простое stat вызова достаточно для решения задачи, e.   g. для размера и имени файла, разделенного пространством:

stat -c '%s %N' /etc/{,**/}*.conf

Для перенаправления вывода этого использовать >file для stdout и 2>file для stderr, e.   g.:

stat -c '%s %N' /etc/{,**/}*.conf >~/stdout 2>~/stderr

Поскольку шарик не соответствует никакому каталогу, для которого у Вас нет верных полномочий, Вы обычно не получаете ошибок разрешения, хотя, но те файлы просто пропускаются вместо этого. Для списка их, можно использовать find и поиск соответствия файлам, не соответствующим o+r разрешение, я.   e. не читаемый другими:

sudo find /etc -type f -name '*.conf' ! -perm -o+r

Дальнейшее чтение

1
ответ дан 21 December 2019 в 23:56

Как упомянуто в комментарии find и printf Ваши друзья на этом присвоении домашней работы. Для использования остроты:

find /etc -name "*.conf" -printf "%s %p\n" 1>namesize.txt 2>errors.txt

Для тестирования компонентов с выведенным на экран испытывают примеры ниже.

$ find /etc -name "*.conf" 1>/dev/null
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/ssl/private’: Permission denied

Это - короткое, которое показывает отклоненное разрешение. Регулярный вывод перенаправляется к /dev/null (нигде), таким образом, Вы не добираетесь для наблюдения только ошибки messges.

$ find /etc -name "*.conf" -printf "%s %p\n" 2>/dev/null | column -t
3874   /etc/bluetooth/main.conf
258    /etc/bluetooth/proximity.conf
397    /etc/bluetooth/input.conf
  (... SNIP ...)
1366   /etc/at-spi2/accessibility.conf
13592  /etc/openal/alsoft.conf
1800   /etc/cracklib/cracklib.conf

Это показывает список filenamnes и размеров, который является слишком длинным для печати полностью. Эти четыре сообщения об ошибках для "Разрешения, отклоненного", отфильтрованы с 2>/dev/null перенаправление всех ошибок к "нигде".

Вывод передается по каналу (использование |) к column -t команда, которая заполняет пробелы позади размеров файла для имен файлов для выравнивания в выводе.


Сравните ссылки на другой ответ

Другой ответ показывает ссылки как это:

$ find -L /etc -type f -name '*.conf' -fprintf ~/filelist '%s %p\n' 2> ~/error.log
$ grep 45-latin.conf ~/filelist | column -t
4621  /etc/fonts/conf.d/45-latin.conf
4621  /etc/fonts/conf.avail/45-latin.conf

Размер ссылки наследовал размер файла, на который это указывает.

Мой ответ показывает ссылки как это:

$ find /etc -name "*.conf" -printf "%s %p\n" 1>namesize.txt 2>errors.txt
$ grep 45-latin.conf namesize.txt | column -t
27    /etc/fonts/conf.d/45-latin.conf
4621  /etc/fonts/conf.avail/45-latin.conf

Размер ссылки является реальным размером ссылки (27 байтов).

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

Смотреть на использование ссылки:

$ ll /etc/fonts/conf.d/45-latin.conf
lrwxrwxrwx 1 root root 27 Aug  2  2018 /etc/fonts/conf.d/45-latin.conf -> ../conf.avail/45-latin.conf
0
ответ дан 21 December 2019 в 23:56

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

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