Я должен сделать сценарий, который печатает размеры всех .conf
файлы от /etc
рекурсивно в указанном файле, и это печатает ошибки, вызванные отсутствием разрешения в другом файле. Я не знаю, как сделать его. Любое предложение было бы очень полезно.
Можно использовать -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] в "файл".~
Расширяется до значения параметра оболочки ДОМОЙ.\
Повреждается длинные линии в несколько строк.Можно использовать 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
Как упомянуто в комментарии 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