chmod de 400.000 arquivos dentro de vários subdiretórios?

1

Howdy ... Eu estou olhando para chmod 777 um monte de arquivos. Alternativamente, uma vez que é mais seguro, eu também poderia me contentar com um chown www: www desses arquivos para torná-los acessíveis pela web.

Agora, como eu tenho mais de 400.000 arquivos, sudo chmod -R 777 ./* e sudo chown -R www:www ./* não funcionaram, retornando apenas com "Arg list too long"

Alguns googling apareceram find e xargs , mas isso não funcionou para o meu conjunto de arquivos, já que alguns dos arquivos tinham sublinhados no nome. Eu não tenho certeza porque isso iria quebrar o script, mas aconteceu. O comando:

find ./ -name "*" | xargs chmod 777

Veja um snippet anônimo da árvore de diretórios:

files
\- 28934723
   \- file1.xml
   \- file2.txt
\- 34905834
   \- file1.xml
   \- file2.txt
\- 21398230
   \- file1.xml
   \- file2.txt

Tanto quanto eu posso dizer de man find , ele deve recorrer a subdiretórios automaticamente, mas não tenho certeza. Quando eu executei o comando acima, alguns dos arquivos foram alterados, mas a maioria dos diretórios permaneceu o mesmo (mesmas permissões).

Agradecemos antecipadamente por qualquer ajuda que vocês possam oferecer:)

    
por Julian H. Lam 07.12.2010 / 20:25

3 respostas

4

sudo chown -R www:www ./ e, se você não quiser o diretório de propriedade de www, basta alterá-lo novamente.

    
por 07.12.2010 / 20:28
0

Não consigo ver por que a seguinte linha de comando não funcionou:

find . -print0 |xargs -0 chmod 777

Ou mais simples, chmod 777 -R .

    
por 07.12.2010 / 20:29
0

Se você puder ajudar, tente limitar as permissões. Se você está tentando dar acesso total a www e você está em um sistema de redhat com acl disponível (pode ser necessário remontar), tente:
setfacl -R -m user:www:rwx the_parent_directory e setfacl -d -R -m user:www:rwx the_parent_directory e repita com o usuário substituído por grupo se necessário.

Se a sua lista de argumentos for muito longa e você não puder usar o diretório completo, isso funcionará (mas será mais lento):
find . -type d -exec setfacl -d -R -m user:www:rwx '{}'; setfacl -R -m user:www:rwx '{}' \;
Se houver arquivos lá também não cobertos por diretórios, você precisará executá-los novamente para aqueles (tenho certeza que alguém irá me informar sobre um switch para setfacl para fazer apenas o diretório principal):find . -type f -exec setfacl -m user:www:rwx '{}' \;
Você pode usar o mesmo método para fazer o 777 também (similar aos xargs mas eu prefiro assim, parece mais limpo:
find . -exec chmod 777 '{}' \; como para os sublinhados, não deveria ser um problema (é possível que eles estivessem sendo interpretado pelo pipe ou algo assim), mas se forem:
find . -name \*_\* -exec chmod 777 '{}' \;

    
por 07.12.2010 / 21:04