find
não irá ignorar os arquivos de pontos, portanto .[^.]*
( .[!.]*
na sintaxe padrão) é redundante e fará com que esses arquivos sejam processados duas vezes (e os diretórios sejam descendentes duas vezes). (observe também que .[!.]*
não possui arquivos chamados ..foo
, por exemplo).
No entanto, find
, por padrão, não desce em links simbólicos para diretórios. Então, se media
é um link simbólico para uma área fora de .
, os arquivos lá não serão processados.
Você pode usar -L
para dizer ao find para seguir os links simbólicos. Observe, no entanto, que isso também fará com que chmod
seja chamado para arquivos que sejam links simbólicos para arquivos regulares.
sudo find -L . -type f -exec chmod 664 {} +
Ou com algumas implementações find
/ xargs
:
find -L . -type f -print0 | sudo xargs -r0 chmod 664
Ao contrário do que foi dito aqui, xargs
e find -exec +
resolverão dividir a lista de argumentos em chmod
se for muito grande.
No entanto, deve-se notar que o limite que estamos falando aqui é o tamanho cumulativo dos argumentos e do ambiente passado para um comando (para a chamada de sistema execve(2)
).
find
e xargs
garantirão que esse limite não seja atingido (e deixará uma pequena margem), mas se você executá-lo como:
find . -type f -print0 | xargs -r0 sudo chmod 644
em vez de:
find . -type f -print0 | sudo xargs -r0 chmod 644
O comando sudo
(chamado por xargs
) receberá todos os argumentos para passar para chmod
e também passará uma variável de ambiente SUDO_COMMAND
para chmod
que contém a lista de arquivos outra vez, então será aproximadamente o dobro do tamanho de arg + env passado para chmod
e explicará porque o limite foi excedido.