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 comls
+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 ).