configura as permissões de leitura e gravação para a pasta e todos os seus diretórios pai

16

Eu preciso definir permissões de leitura e gravação para root user para o diretório subfolderN e todas as suas pastas pai até root .

Eu posso fazer isso com as mãos:

$ sudo chmod +rx /root/subfolder1/subfolder2/subfolderN
$ sudo chmod +rx /root/subfolder1/subfolder2
$ sudo chmod +rx /root/subfolder1
$ sudo chmod +rx /root

Mas se N for grande, estou cansado. Como fazer automaticamente por um comando?

    
por Maxim Yefremov 14.09.2013 / 04:37

4 respostas

19

Isso pode ser feito facilmente no shell, iniciando no subdir e movendo para cima:

f=/root/subfolder1/subfolder2/subfolderN
while [[ $f != / ]]; do chmod +rx "$f"; f=$(dirname "$f"); done;

Isto começa com qualquer arquivo / diretório que você configura f também, e funciona em todos os diretórios pais, até encontrar "/" (ou qualquer coisa que você tenha definido a string na condição do loop). Não chmod "/".

    
por 14.09.2013 / 05:56
5

Com csh , tcsh , ksh , zsh , bash , fish ou yash -o braceexpand :

sudo chmod +rx /root{,/subfolder1{,/subfolder2{,/subfolderN}}}

com zsh :

f=/root/subfolder1/subfolder2/subfolderN
until [[ $f = / ]] {chmod +rx $f; f=$f:h;}

Ou você pode definir uma função qualifier glob como:

explode() {
  reply=()
  until [[ $REPLY = [./] ]] {
    reply+=$REPLY
    REPLY=$REPLY:h
  }
}

Para ser usado, por exemplo, como:

$ echo chmod +rx subfolder1/subfolder2/subfolderN(+explode)
chmod +rx subfolder1 subfolder1/subfolder2 subfolder1/subfolder2/subfolderN  

Observe que chmod +rx é afetado pela umask. Se seu umask não incluir 007 , isso tornaria o diretório /root legível e acessível ao mundo, o que é uma má ideia. /root é tipicamente para coisas privadas do super-usuário, é uma má ideia expô-lo.

    
por 14.09.2013 / 11:13
1

Eu não sei o que você está tentando fazer, mas é melhor do que você não tome a recursiva levemente . Dito isso, leia a resposta real:

Umm ... por que não usar recursivo?

sudo chmod -R +rx /root

Ou, se você não gostar, pode fornecer chmod de vários diretórios:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN
    
por 14.09.2013 / 04:55
1

Bem, você poderia fazer algo um pouco mais complexo como:

echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -anF'/' -e 'while($#F>0){@b=join("/",@F);'chmod +rx @b'; pop @F}' 

Para ver o que isso fará, substitua a chamada chmod pela impressão:

$ echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -alnF'/' -e 'while($#F>0){@b=join("/",@F);print "chmod +rx @b"; pop @F}' 
chmod +rx /root/subfolder1/subfolder2/subfolderN
chmod +rx /root/subfolder1/subfolder2
chmod +rx /root/subfolder1
chmod +rx /root
    
por 14.09.2013 / 05:37