Esta é uma pergunta mais geral sobre 'chmoding' recursivamente.
Eu tenho esse script que em algum momento precisa alterar as permissões recursivamente em uma pasta que possui algumas centenas de milhares de arquivos. Todos os dias, são adicionados novos arquivos nessa pasta, mas os que já estão lá têm as permissões definidas e não são alterados.
Minha pergunta é ... quando ligo
chmod 775. -R
ele tenta definir a permissão para os arquivos que já possuem as permissões corretas, ou apenas para os novos arquivos que não têm as permissões corretas?
Parece que sempre leva séculos para passar esse comando no script, mesmo que os arquivos 'novos' sejam apenas alguns milhares e devam fazer suas permissões rapidamente.
Eu olhei para a página de manual do chmod, mas ela não parece mencionar nada neste caso.
Se o chmod não verificar previamente as permissões, devo começar a combinar 'find' com 'chmod'?
fonte
Respostas:
chmod
pode ou não alterar as permissões dos arquivos que já estão definidos para o que você deseja, mas, caso contrário, ainda será necessário verificá-los para ver quais são suas permissões atuais [0]. Com centenas de milhares de arquivos, não acho que isso importe; o tempo provavelmente está sendo gasto pelas ferramentas emstat
todos os arquivos.Você pode tentar usar
find
arquivos mais recentes que a última execução ou arquivos que precisamchmod
ser executados, mas acho que você não obterá muita melhoria na velocidade.Se possível para o seu script, você poderá colocar os novos arquivos em um diretório separado primeiro, como uma área "em espera". Então você pode
chmod
THAT diretório (que só tem novos arquivos), emv
eles com o resto. Isso deve ser substancialmente mais rápido, mas infelizmente não funcionará para todos os aplicativos.[0] Mesmo que tente definir a permissão de arquivos que não precisam de alterações, o sistema de arquivos subjacente provavelmente não fará nada com a solicitação, porque é desnecessário.
fonte
otimização find / chmod
Ambos
find
echmod
tem que lerVocê provavelmente obtém uma melhoria de desempenho lendo primeiro todas as entradas e depois todos os inodes (em um disco rotativo) porque a cabeça do disco não se move entre o diretório e os inodes). Como
chmod
é estúpido (como uma das outras respostas explica), ele deve ser chamadofind
apenas através . Mas, mesmo assim, pode ser útil ler todos os inodes antes que o primeiro seja gravado (supondo que você tenha RAM livre suficiente para o cache do disco). Eu sugiro isso:A boa solução: ACLs
A boa solução pode ser completamente diferente: se os arquivos forem criados nesse diretório (e não forem movidos de outro lugar), as ACLs poderão executar o trabalho rapidamente. Você apenas precisa definir as ACLs padrão no diretório pai.
Melhorias adicionais podem ser alcançadas pelas otimizações do sistema de arquivos. Se for ext3 / ext4, você poderá executar
e2fsck -D
de tempos em tempos. Talvez ajude a colocar esse diretório em um volume separado. Você pode tentar diferentes sistemas de arquivos ou configurações do sistema de arquivos (por exemplo, diferentes tamanhos de inode).fonte
find
solução sobre dobrou meu tempo,chmod
ing dentro de um recipiente janela de encaixe.Assumindo que o uso de
chmod
do pacote coreutils GNU no Ubuntu 12.10.chmod 775 . -R
executa afchmodat
chamada do sistema para cada arquivo encontrado independentemente de as permissões precisarem ser alteradas ou não. Confirmei isso inspecionando o código e usandostrace chmod 775 . -R
(snippet abaixo) para listar o comportamento real.Existem algumas desvantagens de executar
fchmodat
em cada arquivofind
/xargs
/chmod
mencionado por outras pessoas provavelmente será mais rápido alterando apenas os arquivos que precisam ser alterados.fchmodat
altera a modificação do status do arquivo (ctime) de cada arquivo. Isso fará com que cada arquivo / inode seja alterado a cada vez e provavelmente causará excesso de gravações no disco. Pode ser possível usar as opções de montagem para interromper essas gravações em excesso.Um experimento simples mostra as mudanças ctime acontecendo diretamente
chmod
Mas isso não muda por
find
/xargs
/chmod
alguns minutos depoisEu sempre tenderia a usar a versão
find
/xargs
/chmod
porque find dá mais controle sobre a seleção de coisas.fonte
A [fonte] (1) mostra, que
chmod(1)
sempre tenta definir o modo e depois verifica novamente com [fstatat (2)] (2).Os arquivos são processados via [fts (3)] (3), que deve 'stat' todos os objetos do sistema de arquivos percorridos anteriormente para construir sua árvore de dados.
O Unixlore apresenta um [belo artigo] (4) no qual
chmod(1)
é cronometrado contra uma abordagemfind
/xargs
: o último vence por magnitudes.Aqui a linha de comando se adaptou à pergunta original:
Duas razões:
O percurso do sistema de arquivos é dissociado das operações nos arquivos por meio do canal entre os dois processos, que podem até rodar em núcleos diferentes.
fts(3)
operação é minimizada, porquexargs(1)
'nivela' a árvore de diretórios.Então sim: você definitivamente deveria usar
find
/xargs
. para uma solução simples.Outras opções:
Brinque com o [umask] (5) e o código-fonte do (s) processo (s) que está escrevendo os novos arquivos.
Se você estiver usando Linux, é provável que seu sistema tenha ativado o
inotify
subsistema de kernel. Nesse caso, você pode criar um script de uma solução eficiente via [inotifywait (1)] (6).Nota: a menos que você queira executar permissões em seus arquivos, sugiro que modifique a chamada da seguinte forma:
Nota para os editores: Não tenho permissão para adicionar mais de dois links à postagem, nem comentar em outras postagens. Deixo os URLs aqui e espero que algum usuário sincero com reputação suficiente os coloque de volta no texto e exclua este parágrafo.
Comente sobre como preparar o cache do disco com
find . -printf ""
:Isso pode acelerar a execução das seguintes
chmod
operações, no entanto, depende da memória disponível e da carga de E / S. Portanto, pode funcionar ou não. A dissociação de traversal (find
) echmod
operação já fornece armazenamento em cache, portanto, a preparação do cache pode ser supérflua.fonte
Você já pensou em alterar os processos que criam o arquivo para que eles sejam criados no modo 0775? Observe o valor umask no ambiente - 0002 pode ajudar.
fonte