Найти все файлы и каталоги с группой, отличной от владельца
Я хочу найти все файлы и каталоги, которые имеют группу, отличную от владельца.
Так что, если бы это были два файла в каталоге, я бы хотел найти первый:
$> 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
команда.
Не стесняйтесь добавлять дополнительные детали.