Use o comando chmod seletivamente


11

Quero definir a permissão 755 em todos os arquivos e subdiretórios em um diretório específico, mas quero executar o chmod 755 apenas para os componentes que não têm permissão 755.

find /main_directory/ -exec chmod 755 {} \;

Se o findcomando retornar uma lista longa, isso levará muito tempo. Eu sei que posso usar o comando stat para verificar a permissão no nível do arquivo Octal de cada componente e, em seguida, usar if-else para alternar a permissão do arquivo, mas existe uma abordagem de linha única usando finde xargspara verificar primeiro qual permissão o arquivo / diretório possui e, em seguida, use chmodpara alterá-lo para 755 se estiver definido para outra coisa.


6
Isso pode ser uma otimização prematura e pode nem ser mais rápida. A realização de todas essas verificações pode diminuir a velocidade. Testar para garantir que seja mais rápido, só será recompensado se você precisar fazer isso muito.
ctrl-alt-Delor

3
Você provavelmente não deseja conceder permissões de execução a todos os arquivos. Isso criará um risco de segurança. (este é um dos vetores de vírus no Windows da Microsoft: tudo é executável). No modo simbólico, você pode dizer u+rw,go+r,go-w,ugo+X- observe a capital.
ctrl-alt-Delor

Eu concordo com @ ctrl-alt-delor, mas gostaria de sugerir algo mais próximo do que você pediu, u = rwX, go = rX, que deve obter a mesma coisa.
Penguin359

Respostas:


21

Se você deseja alterar as permissões para 755arquivos e diretórios, não há benefício real em usá-lo find(pelo menos do ponto de vista de desempenho) e você pode fazer isso

chmod -R 755 /main_directory

Se você realmente deseja usar findpara evitar alterar permissões em itens que já possuem 755permissões (para evitar a atualização do carimbo de data / hora do ctime), também deve testar as permissões atuais em cada diretório e arquivo:

find /main_directory ! -perm 0755 -exec chmod 755 {} +

Ele -exec ... {} +coletará o maior número de nomes de caminhos possíveis que passarem no ! -perm 0755teste e será executado chmodem todos eles de uma só vez.

Geralmente, alguém desejaria alterar permissões em arquivos e diretórios separadamente, para que nem todos os arquivos sejam executáveis:

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +

Funcionou como charme, obrigado. Atenciosamente, Kumarjit
Kumarjit Ghosh

1
Eu suspeito que usar em +vez de ;faz uma grande diferença aqui.
Kevin

Esta é a maneira rápida - evite um cheque. Eu usaria o find para fazer uma lista apenas dos arquivos que você tem permissão para alterar, para evitar erros de chmod nos arquivos que não podem ser alterados. <pre> <code> # rwx, rw, wx, w apenas localizamos. -user $ (whoami) -perm / 002! -perm 0755 -exec chmod 0755 {} \; # divida em duas operações find. -user $ (whoami) -perm / 002! -perm 0755> /tmp/chfiles.txt para o arquivo em $ (</ tmp / chfiles.txt) do chmod --quiet 0755 "$ {file}" done </code> </pre>
Chris Reid

@ChrisReid Observe que o loop sobre uma lista de nomes de caminhos como esse será interrompido se algum nome de caminho contiver um caractere de espaço em branco.
Kusalananda

Eu acho que você precisa alterar o Internal Field Separator (IFS) para '\ n' em um script. Essas são configurações do ambiente, a maneira como o shell as interpreta depende dos valores dessas configurações. Testo scripts em arquivos fictícios antes de usá-los para descobrir desastres desastrados, como renomear arquivos ou substituí-los. Eu gosto da maneira shell printf de definir o IFS. IFS = $ (printf "\ n") # muito legível
Chris Reid

1

Como você findobteve a -exec ... +sintaxe, não há muito sentido em usá-lo xargs, mas como você pede:

find /main_directory -not -perm 0755 | xargs chmod 755

1
Observe também que o xargs sem -0(em combinação com o -print0find; que é a extensão GNU) pode ser bastante problemático em termos de segurança se um invasor em potencial puder criar nomes de arquivos que incluem espaços em branco ou outros caracteres especiais. Então é melhor ficar com -execquando puder
Matija Nalis

Não é necessário xargs(apenas use -exec), e se você o usar, deverá usar -print0/ -0como Matija diz.
Kevin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.