find . -exec sh -c ' stat -c "%U %G" "$1" | awk -F " " "\$1==\$2" ' sh {} \; -print
Он работает stat
для каждого объекта, извлекает его владельца и группу; awk
затем возвращает статус выхода, 0
только если они отличаются. В действительности только они напечатаны.
Заметки:
- Производительность низкая. Каждый объект нуждается в своем собственном
sh
,stat
иawk
. У меня были некоторые идеи по улучшению этого (find . -exec stat … {} + | awk …
), но я не уверен, что смогу сделать их достаточно надежными для работы с возможными именами файлов с символами новой строки и т. Д. Я решил не рисковать. Вы можете использовать-print0
при необходимости. Этот подход также позволяет добавить больше условийfind
. - В моем Kubuntu
stat -c "%U %G"
возвращаетсяUNKNOWN
UID (или GID), которые нельзя перевести на имена. Я думаю, что если будет пользовательUNKNOWN
или группаUNKNOWN
, это будет мешать. Возвращаемый объектUNKNOWN UNKNOWN
наивно интерпретируется как имеющий совпадающего владельца и группу.