Existe uma maneira mais rápida de encontrar arquivos específicos do que usando find?

1

Eu tenho que encontrar em uma pasta os arquivos que não possuem certas permissões (755). O subdiretório tem outros subdiretórios contendo no total milhões de arquivos, e o comando find ./ -not -perm 755 demora muito.

Existe um comando mais eficiente / rápido para executar essa tarefa (como o ls combinado com o grep ou mais)?

    
por mazs 12.04.2016 / 15:12

3 respostas

5

Se você usar ls -lR , precisará excluir o conteúdo da saída, de alguma forma, e, em seguida, grep do que deseja.

find provavelmente é mais rápido. Aqui está um hack muito rápido na minha máquina (os grep são feios, não me orgulho deles).

tony@trinity:~$ time ls -lR | grep "tony tony" | grep -vc "rwxr-xr-x"
115668

real    0m3.247s
user    0m1.456s
sys     0m1.808s
tony@trinity:~$ time find ./ -not -perm 755 | wc -l
125185

real    0m0.503s
user    0m0.120s
sys     0m0.380s
tony@trinity:~$ time ls -lR | grep "tony tony" | grep -vc "rwxr-xr-x"
115668

real    0m3.128s
user    0m1.564s
sys     0m1.920s
tony@trinity:~$ time find ./ -not -perm 755 | wc -l
125185

real    0m0.501s
user    0m0.196s
sys     0m0.428s

Algumas notas:

  • Eu corri os dois comandos duas vezes para remover a chance de diferença do cache
  • Você notará que eles retornam contagens diferentes, mas meu hack rápido não é suficiente para isolar apenas os arquivos e entradas de diretório relevantes.
  • O objetivo disso não é mostrar uma solução melhor, mas mostrar que find é bastante rápido em comparação com ls + grep .

Pode haver soluções mais rápidas, como algo em perl , ou uma maneira de fazer com que ls seja mais rápido (definir $LANG ? - meus testes mostraram que isso bate um segundo na saída ls provavelmente pode dizer a ls para não classificar também, o que pode ajudar).

Edit: Acabei de ver o seu comentário, onde você também diz que precisa alterar as permissões. Nesse caso, find é absolutamente a resposta certa, porque pode fazer todo o trabalho de uma só vez.

find ./ -not -perm 755 -exec chmod 755 {} \;

Você deve ser extremamente cuidadoso ao executar esse comando para garantir que esteja no local correto. Uma opção mais segura seria,

find /actual/full/path -not -perm 755 -exec chmod 755 {} \;

para evitar que você altere todos os arquivos do sistema se estiver no lugar errado.

Além disso, você provavelmente deve considerar softlinks, diretórios e arquivos não regulares e modificar seu find como resultado. Então, assumindo que você só se importa com arquivos, eu começaria com

find /actual/full/path -type f -not -perm 755 -exec chmod 755 {} \;

Por último, você pode se perguntar se está alterando as permissões de cada arquivo em um diretório ou conjunto de diretórios que não tenham permissões 755 a 755, então você não precisa fazer nada complexo.

find /actual/full/path -type f -exec chmod 755 {} \;

Isso só vai definir todos eles para 755. Pode ser um pouco mais rápido (menos lógica na escolha de quais arquivos atualizar e atualizar milhões de arquivos no valor de permissões, depende do número de arquivos que já estão corretos ).

    
por 12.04.2016 / 15:38
1

Se sua intenção é fazer com que todos os arquivos e diretórios tenham 755 permissões, você pode simplesmente executar um chmod recursivo:

chmod -R 755 $directory

Se você precisar de arquivos para o modo 644, talvez seja melhor com

chmod -R u=rwX,go=rw $directory

Isso usará um único processo para encontrar os arquivos necessários e atualizar suas permissões quando necessário.

Se você precisar encontrar arquivos com permissões diferentes por algum outro motivo, find será sua melhor escolha.

    
por 12.04.2016 / 18:05
-1

Se você tiver o mlocate instalado, isso ficará mais fácil, mas somente se você souber parte do nome do arquivo. Além disso, a menos que você faça alterações de permissão no arquivo mlocate.db, ele precisa de root.

Quando instalado, um cron job deve ser executado periodicamente para atualizar o banco de dados mlocate, ou você pode executar o updatedb para fazê-lo manualmente. Uma vez lá, use o comando locate.

    
por 12.04.2016 / 15:21

Tags