Encontre todos os arquivos e diretórios com grupo diferente do proprietário

0

Eu quero encontrar todos os arquivos e diretórios que têm um grupo diferente do proprietário.

Então, se esses fossem os dois arquivos no diretório, eu gostaria de encontrar o primeiro:

$> 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

Eu tenho tocado com o find, mas estou começando a pensar que vou ter que desistir e escrever algum tipo de script (eu prefiro não escrever um roteiro).

Obrigado antecipadamente.

    
por Jistanidiot 27.07.2018 / 15:57

2 respostas

1
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 e awk 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 a find .
  • No meu Kubuntu stat -c "%U %G" retorna UNKNOWN para UIDs (ou GIDs) que não podem ser traduzidos para nomes. Se houver um usuário UNKNOWN ou um grupo UNKNOWN , isso vai interferir, eu acho. Um objeto que retorna UNKNOWN UNKNOWN é ingenuamente interpretado para ter proprietário e grupo correspondentes.
por 27.07.2018 / 17:16
0

Bem, encontrei uma solução diferente que usa ls e awk em vez de encontrar. E isso certamente precisa e pode ser otimizado. Aqui vai:

ls -alR | awk '{ if ($3 != $4) print $0 }'

Como funciona:

  • Veja o que -alR faz de homem ls
  • o awk pesquisa o padrão.
  • $3 & $4 corresponde a 3 rd & 4 th coluna na saída ls que são file owner e group do qual o proprietário faz parte.
  • $0 fornece linha completa na saída ls.
  • A condição if ($3 != $4) print $0 interpreta "Imprimir linha completa com todas as colunas em que o valor na coluna 3 rd não é igual ao valor em 4 th coluna "
  • O comando completo pode ser interpretado como Imprimir apenas a linha na saída ls em que o nome do proprietário do arquivo e o nome do grupo não são os mesmos .

Limitação:

Às vezes, dá esse erro para alguns arquivos:

ls: cannot open directory './chatscripts': Permission denied

Tanto quanto eu entendo, é um problema de permissão com o usuário do qual o comando está sendo executado. O usuário não é proprietário nem faz parte do grupo para esse arquivo e, portanto, não pode acessá-lo.

O que você quer pode ser definitivamente feito com o comando find , mas acho que isso pode ser uma solução também e também ainda haverá esse problema de permissão Se você fizer isso com o comando find .

Sinta-se à vontade para adicionar mais detalhes.

    
por 27.07.2018 / 17:23