find . -exec sh -c '
stat -c "%U %G" "$1" |
awk -F " " "\==\{exit 1}"
' sh {} \; -print
Ele executa stat
para cada objeto, recupera seu proprietário e grupo; awk
retornará o status de saída 0
apenas se forem diferentes. Na verdade, apenas estes são impressos.
Notas:
- O desempenho é baixo. Cada objeto precisa de seus próprios
sh
,stat
eawk
separados. Eu tive algumas idéias para melhorar isso (find . -exec stat … {} + | awk …
), mas não tenho certeza se posso torná-las robustas o suficiente para trabalhar com possíveis nomes de arquivos com novas linhas etc. Eu decidi jogar com segurança. Você pode usar-print0
, se necessário. Essa abordagem também permite adicionar mais condições afind
. - No meu Kubuntu
stat -c "%U %G"
retornaUNKNOWN
para UIDs (ou GIDs) que não podem ser traduzidos para nomes. Se houver um usuárioUNKNOWN
ou um grupoUNKNOWN
, isso vai interferir, eu acho. Um objeto que retornaUNKNOWN UNKNOWN
é ingenuamente interpretado para ter proprietário e grupo correspondentes.