Existe outra possibilidade que descobri usando ACLs: o X maiúsculo. Dada a seguinte estrutura (três diretórios, três arquivos):
drw------- 1/
drw------- 2/
drw------- 3/
-rw------- 4
-rw------- 5
-rw------- 6
É possível definir a execução, mas apenas para diretórios, usando:
chmod u+X *
O que resultará em:
drwx------ 1/
drwx------ 2/
drwx------ 3/
-rw------- 4
-rw------- 5
-rw------- 6
Em comparação com find
e xargs
, isso tem a vantagem de exigir apenas um comando e, portanto, nenhum pipe. Por essa razão, eu estaria inclinado a dizer que isso é mais rápido.
No seu exemplo, você está basicamente usando dois comandos em uma linha:
- O primeiro pesquisa arquivos, imprime seus nomes e
xargs
faz o resto. - A segunda pesquisa diretórios, o mesmo comportamento.
Em cada uma dessas chamadas, você executa três comandos :
- Execute
find
para que seja impresso os nomes dos arquivos nos quais você tem interesse. - Passe esses nomes para
xargs
para que ele funcione como um wrapper em torno dechmod
(que é, portanto, chamado apenas uma vez).
Também é interessante notar que, usando &&
, você garante que o segundo comando seja executado apenas se o primeiro for bem-sucedido (ainda assim, não vejo como find
poderia falhar no seu caso). / p>
No entanto, ao usar apenas find
( -exec
), o comando chmod
é chamado para cada arquivo que corresponde aos critérios find
. Se você tiver 200 arquivos em seu diretório, chmod
será chamado 200 vezes, o que é mais lento do que chamar chmod
uma vez, em 200 arquivos. É claro que, no final, como chmod
é uma operação relativamente rápida e casual, você não sentirá a diferença em um número razoável de arquivos.
Finalmente, outro detalhe sobre a passagem de nomes de arquivos entre programas: espaços. De acordo com como cada comando processa nomes de arquivos (usando aspas adequadas ou não), você pode encontrar problemas ao processar arquivos com espaços em seus nomes (já que Este Super Picture.png pode ser processado rapidamente como , Super e Picture.png ).