Encontre diretórios e arquivos com permissões diferentes de 775/664

21

Estou movendo um site de um servidor para outro e o Git não armazena metadados, como permissões de arquivo. Preciso encontrar os diretórios e arquivos que não são 775/664, respectivamente.

No momento, estou usando esta engenhoca de paralelepípedos:

$ find . -type d -exec ls -la {} \; | grep ^d | grep -v ^drwxrwxr-x
$ find . -type f -exec ls -la {} \; | grep -v ^d | grep -v ^-rw-rw-r-- | grep -v '.git'

Embora isso funcione, acho que é bastante hacky. Existe uma maneira melhor de fazer isso, talvez uma maneira canônica, ou devo apenas ser hacky?

Isso está sendo executado em uma versão recente do Ubuntu com as ferramentas GNU no Bash.

dotancohen
fonte

Respostas:

39

Use o -permteste para findem combinação com -not:

find -type d -not -perm 775 -o -type f -not -perm 664
  • -perm 775corresponde a todos os arquivos com permissões exatamente iguais a 775. -perm 664faz o mesmo para 664.
  • -not (booleano NOT) nega o teste a seguir, portanto, corresponde exatamente ao contrário do que teria: nesse caso, todos os arquivos que não têm as permissões corretas.
  • -o(OR booleano) combina dois conjuntos de testes juntos, correspondendo quando um deles faz: tem a menor precedência; portanto, divide nossos testes em dois grupos distintos. Você também pode usar parênteses para ser mais explícito. Aqui, combinamos diretórios com permissões que não são 775e arquivos comuns com permissões que não são 664.

Se você quiser dois comandos separados para diretórios e arquivos, corte-o ao meio -oe use cada um separadamente.

Michael Homer
fonte
Bonito obrigado! Eu não sabia que duas condições diferentes poderiam ser definidas (tipo -d e tipo -f por exemplo) nem eu sabia sobre -perm.
dotancohen
Talvez observe que esse -notnão é um padrão POSIX; eles usam em seu !lugar.
user1404316
2

Não faço ideia do que seu código estava tentando alcançar. Normalmente, o motivo para encontrar arquivos e diretórios com permissões incorretas é para alterá-los.

Então é isso que estou usando com sucesso no Ubuntu 16.04

find \! -perm 775 -type d -exec chmod 775 {} \;
find \! -perm 664 -type f -exec chmod 664 {} \;

Isso demonstra o! símbolo sendo escapado

NZ Dev
fonte
Na verdade, o objetivo não era alterar as permissões dos arquivos, mas identificar quais arquivos precisam de permissões de floco de neve ao carregá-los em um servidor da web de produção. Obrigado.
dotancohen