alterar recursivamente a permissão de arquivo, mas não os diretórios?

13

Eu estava fazendo uma alteração recursiva em massa de permissões de alguns arquivos que eu havia migrado para um sistema unix. Alterei-os para ug + rw, mas depois descobri que não podia atravessar subdiretórios. Eu olhei para a página de manual chmode não vi nenhuma explicação para excluir diretórios, então pesquisei um pouco e descobri que as pessoas costumavam findalterar recursivamente as permissões nos diretórios para 'executar' para usuário e grupo. Eu fiz isso e depois pude olhar para eles.

Mas parecia-me que eu seria capaz de fazer essa descoberta chmod- alterar recursivamente os arquivos para leitura / gravação, mas não tornar os diretórios intransferíveis. Eu fiz isso da maneira 'certa' ou existe uma maneira mais simples de fazer isso?

user394
fonte

Respostas:

12

A melhor solução deve ser

chmod -R ug=rwX,o=rX /path

onde capital Xsignifica: defina bit de execução se

o arquivo é um diretório ou já possui permissão de execução para algum usuário

(citado na chmodpágina do manual).

Ou também, se você quiser usar find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)
enzotib
fonte
Usei a versão aberta deste comando para todos no meu disco rígido USB: chmod -v -R ugo = rwX / path Obrigado!
The Dude
Evidentemente, não há como usar findpara definir todas as permissões de arquivo para 600 e todas as permissões de diretório para 700. (Cheguei aqui através dos meus googlings sobre o assunto.) Se isso puder ser feito com um único chmod -Rcomando, fique à vontade para me corrigir.
Curinga
@Wildcard: não exatamente, o comando chmod -R u=rwX,go= /pathfaz quase o que você deseja: define todos os diretórios para 700 e todos os arquivos para 600 ou 700, dependendo se o bit de execução já está definido ou não, e acho que é a coisa certa a fazer .
enzotib
1
@enzotib, sim - quase, mas não exatamente. No meu caso, quero desativar o bit de execução de todos os arquivos (mas não dos diretórios, é claro), independentemente de serem scripts ou binários ou o que for. Portanto, o findcomando que você escreveu foi muito útil como modelo. :)
Curinga
@Wildcard, que tal remover primeiro o bit de execução, recursivamente, e adicioná-lo novamente aos diretórios usando o comando acima?
Michael Michael
3

O uso de find é o caminho 'certo' e o único caminho programático, embora haja variações:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

ou

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

ou o mais lento:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

Cada um deles seleciona um arquivo (não diretório, nem link simbólico) e aplica o chmodcomando nele. Os dois primeiros reduzem o número de chamadas chmodanexando o arquivo ao final de uma linha de comando interna a cada vez até que seja atingido o máximo (geralmente 10), depois chama o comando e começa a reconstruir um novo comando. A última instrução gera um novo processo para cada arquivo, portanto é menos eficiente.

Arcege
fonte