Найти все файлы и каталоги с группой, отличной от владельца
Я хочу найти все файлы и каталоги, которые имеют группу, отличную от владельца.
Так что, если бы это были два файла в каталоге, я бы хотел найти первый:
$> ls -l
-rw-rw-r--. 1 user175 group192 866 Dec 12 2006 index.htm
-rw-r--r--. 1 user175 user175 921 Dec 14 2006 index2.html
Я играл с find, но начинаю думать, что мне придется сдаться и написать какой-то сценарий (я бы действительно не писал сценарий).
Заранее спасибо.
2 ответа
find . -exec sh -c '
stat -c "%U %G" "$1" |
awk -F " " "\$1==\$2{exit 1}"
' sh {} \; -print
Работает stat для каждого объекта извлекает его владельца и группу; awk затем возвращает статус выхода 0 только если они отличаются. В действительности только они напечатаны.
Заметки:
- Производительность низкая. Каждый объект нуждается в своем отдельном
sh,statа такжеawk, У меня были некоторые идеи, чтобы улучшить это (find . -exec stat … {} + | awk …) но я не уверен, что смогу сделать их достаточно надежными для работы с возможными именами файлов с символами новой строки и т. д. Я решил не рисковать. Ты можешь использовать-print0если нужно. Этот подход также позволяет добавить больше условий кfind, - По моему Кубунту
stat -c "%U %G"возвращаетсяUNKNOWNдля UID (или GID), которые не могут быть переведены в имена. Если есть пользовательUNKNOWNили группаUNKNOWNэто будет мешать, я думаю. Возвращение объектаUNKNOWN UNKNOWNнаивно интерпретируется как наличие подходящего владельца и группы.
Ну, я нашел другое решение, которое использует ls а также awk вместо того чтобы найти. И это, безусловно, необходимо и может быть оптимизировано. Здесь это идет:
ls -alR | awk '{ if ($3 != $4) print $0 }'
Как это устроено:
- Смотри что
-alRделает от человека LS - awk ищет шаблон.
$3&$4соответственно дает 3- й и 4- й столбцы в выводе ls, которыеfile ownerа такжеgroupэтот владелец является частью.$0дает полную строку в выводе ls.- Состояние
if ($3 != $4) print $0интерпретируется как "Вывести полную строку со всеми столбцами, в которых значение в 3- м столбце не равно значению в 4- м столбце" - Полная команда может быть интерпретирована как Печать только тех строк в выводе ls, где имя владельца файла и имя группы не совпадают.
Ограничение:
Иногда, это дает эту ошибку для некоторых файлов:
ls: cannot open directory './chatscripts': Permission denied
Насколько я понимаю, это проблема разрешения пользователя, от которого выполняется команда. Пользователь не является ни владельцем, ни частью группы для этого файла и, следовательно, не может получить к нему доступ.
То, что вы хотите, может быть определенно сделано с find команда, но я думаю, что это тоже может быть решением, но проблема с разрешениями все еще будет возникать, если вы сделаете это с find команда.
Не стесняйтесь добавлять дополнительные детали.