Eu meio que estraguei o backup do meu diretório pessoal com rsync
(talvez porque estou fazendo backup em um sistema de arquivos NTFS): todos os arquivos estão aqui, mas todos os direitos de acesso a arquivos e diretórios são 777. Eu queria saber se havia um utilitário mágico que mudar recursivamente:
- os diretórios de 777 a 755.
- os arquivos regulares de 777 a 644. Não tenho muitos executáveis em minha casa, então posso gerenciar isso manualmente mais tarde.
- deixe outros arquivos (links, qualquer outra coisa?) inalterados.
Fazê-lo no shell é fácil, mas levará horas...
Pergunta subsidiária: qualquer conselho para fazer backup corretamente de uma hierarquia de diretórios Linux em NTFS (com rsync
ou outro).
A solução padrão recomendada é direta:
Isso acrescentará tantos nomes de arquivo quanto possível como argumentos a um único comando, até o comprimento máximo da linha de comando do sistema. Se a linha exceder esse comprimento, o comando será chamado várias vezes.
Se você quiser chamar o comando uma vez por arquivo, você pode fazer:
chmod -R a=,u+rwX,go+rX $DIR
seems to work fine, and is very likely to be the fastest, however you look at it.(I checked with
strace
, and it makes only onefchmodat()
syscall per file/directory -- for files that is with 644 and for directories with 755).The trick is the
X
permmission, documented inman chmod
, which acts likex
for directories only -- the very distinction you wanted.What is not documented is my guess that they would be applied in the same sequence as they are specified, and not just in some random order, but repeated tests with several variants have convinced me that they do indeed run in the order given, so I am pretty sure this is always going to work like this.
I should mention this is on Linux, though a cursory reading of the BSD manpage for chmod suggest that it should work there also.
Eu comparei a resposta de sitaram , o comentário de Peter Cordes , a resposta de Fanatique e a resposta de harrymc , mas esta resposta tem o caminho mais rápido .
Médias:
* Crédito para Peter Cordes por sugerir paralelismo
Resumo estatístico completo:
Comando de Deltik, em formato de benchmark:
comando do sitaram, em formato de benchmark:
Comando de Peter Cordes, em formato de benchmark:
Comando do Fanatique, em formato de benchmark:
comando atualizado do harrymc, em formato de benchmark:
comando original do harrymc, em formato de benchmark:
Meu comando foi o mais rápido graças aos quatro
chmod
processos paralelos por tipo de arquivo. Isso permitiu que vários núcleos de CPU fossem executadoschmod
, o que move o gargalo para os threads de E/S do kernel ou para o disco.o comando do sitaram foi o vice-campeão porque tudo é feito dentro do
chmod
comando. Isso reduz substancialmente a sobrecarga em comparação com as outras respostas porque:find
em vez de dois) eEste comando é o menos flexível, no entanto, porque depende de um truque envolvendo o significado diferente do bit executável entre arquivos e diretórios regulares.
O comentário de Peter Cordes, que usa um
find
comando, evita pesquisas duplas de entradas de diretório. Quanto mais arquivos houver, mais substancial será essa melhoria. Ele ainda tem a sobrecarga de criarchmod
processos filho, e é por isso que é um pouco mais lento do que achmod
solução -only.Entre o comando do Fanatique e o comando atualizado do harrymc,
find
canalizado paraxargs
(find | xargs
) foi mais rápido porque o fluxo de resultados é processado de forma assíncrona. Em vez defind
pausar seu comportamento de localização para-exec
, os resultados encontrados são enviadosxargs
para processamento simultâneo.(O delimitador de bytes nulos (
find -print0 | xargs -0
) não parece afetar o tempo de execução.)O comando original do harrymc era muito lento devido à sobrecarga de um novo
chmod
comando para cada arquivo e pasta, cada um executado em sequência.Na configuração de teste, havia 1000002 arquivos regulares contidos em 1001 diretórios:
Eu configurei todos os arquivos e pastas para ter
777
permissões, como as condições iniciais da pergunta.Em seguida, comparei os comandos dez vezes, sempre restaurando as permissões antes
777
dechmod -R 0777 "$(pwd)"
executar o teste.Ao representar um
OUTPUT
arquivo que contém a saída de cada comando de benchmark, calculei o tempo médio usando:Resultados do benchmark da resposta de Deltik
Tempo médio: 7.480 segundos
Resultados do benchmark da resposta do sitaram
Tempo médio: 12.962 segundos
Resultados do benchmark do comentário de Peter Cordes
Tempo médio: 14.414 segundos
Resultados do benchmark da resposta da Fanatique
Tempo médio: 14.570 segundos
Resultados do benchmark da resposta atualizada de harrymc
Average time: 14.791 seconds
Results of the benchmark of harrymc's original answer
Due to how slow this command was, I only ran the benchmark once.
Time taken: 1061.926 seconds
Se os diretórios forem muito grandes e contiverem muitos arquivos, a maneira original que @harrymc mostrou para você falhará.
Se você tiver muitos arquivos , precisará canalizar
find
com :xargs
chmod