localizar apenas arquivos no diretório com permissões não definidas para 644 no linux

7

Esta é a minha primeira pergunta, embora eu esteja à espreita há algum tempo.

Pergunta: Eu gostaria de usar find para obter apenas os arquivos em um diretório com permissões não definidas para 644 (ou outro valor de permissão). Existe uma maneira mais curta de escrever isso ou é a única maneira de usar apenas as opções -perm e -or e listar cada tipo de permissão, exceto para 644?

Isso faz parte de um comando maior que eu esperava acelerar:

find /path/to/dir/ -type f -print0 | xargs -0 chmod 644

Espero que, ao fornecer xargs, apenas os nomes dos arquivos que precisam ser atualizados sejam acelerados. O diretório tem ~ um milhão de arquivos, mas apenas 10.000 geralmente precisam de permissões atualizadas. Eu acho que o comando é lento porque ainda está pipetando todos os arquivos, independentemente. Talvez haja uma abordagem mais eficiente para o comando maior. Deixe-me saber se você souber de um. Eu ainda gostaria de saber a resposta para essa pergunta. E, a propósito, não consigo atualizar as permissões antes de adicionar os arquivos ao diretório.

    
por M Brown 30.07.2010 / 23:19

4 respostas

17

O operador ! retorna verdadeiro quando uma condição é falsa.

Assim, enquanto -perm 0644 corresponde a arquivos que possuem permissões rw-r - r--, ! -perm 0644 corresponde àqueles que não têm essas permissões.

O comando que você precisa é:

find /path/to/dir/ -type f ! -perm 0644 -print0 | xargs -0 chmod 644
    
por 30.07.2010 / 23:30
3
  find /path/to/dir ! -perm 0644 

e

    find /path/to/dir ! -perm 0644 -exec chmod 0644 {} \;
    
por 30.07.2010 / 23:29
3

Pelo menos com o GNU find, você pode usar o! operador para negação com -perm. Por exemplo:

find /path/to/dir ! -perm 644

Com base no exemplo que você está dando, você está apenas procurando garantir que os proprietários tenham pelo menos leitura / gravação e que todos tenham pelo menos lido? Se sim, então você pode apenas fazer isso com chmod:

chmod -R a+r,u+w /path/to/dir/*
    
por 30.07.2010 / 23:31
2

Uma possível solução seria se você tivesse menos diretórios, executasse um chmod -R 644 /path/to/dir e depois executasse um find /path/to/dir -type d -exec chmod 755 {} \; .

    
por 30.07.2010 / 23:31