ustaw uprawnienia do odczytu i zapisu do folderu i wszystkich jego katalogów nadrzędnych

18

Muszę ustawić uprawnienia do odczytu i zapisu dla rootużytkownika do katalogu subfolderNi wszystkich jego folderów nadrzędnych do root.

Mogę to zrobić ręcznie:

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

Ale jeśli Njest duży, jestem zmęczony. Jak to zrobić automatycznie za pomocą jednego polecenia?

Maksym Jefremow
źródło
Naprawdę nie powinieneś czynić /rootświata czytelnym.
Stéphane Chazelas,

Odpowiedzi:

23

Można to łatwo zrobić w powłoce, zaczynając od podkatalogu i przechodząc w górę:

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

Zaczyna się to od dowolnego pliku / katalogu, który ustawisz również f, i działa na każdym katalogu nadrzędnym, aż napotka „/” (lub cokolwiek ustawisz ciąg w stanie pętli na). Nie chmod „/”.

wingedsubmariner
źródło
Fajnie, wiedziałem, że niepotrzebnie komplikuję sprawy z Perlem.
terdon
Ale co, jeśli fjest ścieżką względną, i chcę zatrzymać się na tym, co jest względne zamiast /?
StackExchange dla wszystkich
@ StéphaneChazelas Thanks. Jeśli $ftak foo/bar, czy $fkiedykolwiek zmieni się na .? Tak dirnameto robi. Dzięki
StackExchange dla wszystkich
1
@ Czas przekonwertować ścieżkę względną na ścieżkę bezwzględną przed zapisaniem wf za pomocą polecenia „f =` readlink -f <ścieżka_relatywna> `”
Talespin_Kit
6

Z csh, tcsh, ksh, zsh, bash, fishlub yash -o braceexpand:

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

Z zsh:

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

Lub możesz zdefiniować funkcję kwalifikatora globu, taką jak:

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

Do użycia na przykład jako:

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

Zauważ, że chmod +rxma na to wpływ umask. Jeśli umasknie ma 007tego w /rootkatalogu, katalog byłby czytelny i dostępny dla wszystkich, co jest złym pomysłem. /rootjest zwykle przeznaczony do prywatnych rzeczy superużytkownika, złym pomysłem jest ujawnienie go.

Stéphane Chazelas
źródło
Czy mógłby Pan wyjaśnić, co się wiodącym ,w {,/subfolder}robi?
terdon
Tworzy przemianę, w której pierwszy ciąg jest pusty, a drugi jest /subfolder; więc /root{,/subfolder}produkuje /rooti/root/subfolder
tripleee
W szczególności nie jest to przenośne dla POSIXsh
tripleee
2

Cóż, możesz zrobić coś nieco bardziej złożonego, na przykład:

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

Aby zobaczyć, co to zrobi, zamień chmodpołączenie na print:

$ 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
terdon
źródło
1

Nie wiem, co próbujesz zrobić, ale jest to lepsze niż lekceważenie rekurencji . To powiedziawszy, przeczytaj aktualną odpowiedź:

Umm ... dlaczego nie użyć rekurencyjnego.

sudo chmod -R +rx /root

Lub jeśli ci się nie podoba, możesz podać chmodkilka katalogów:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN
Braiam
źródło
4
Nie jest to jednak prawie ta sama operacja. chmod -R /rootzmienia wszystko pod /root- w tym zwykłe pliki i wszystkie katalogi. Pytanie dotyczy zmiany tylko jednego łańcucha katalogów.
200_success
@ 200_success, ale to nie jedyna odpowiedź;)
Braiam
Pytanie nie dotyczy rekurencji, ale jak ustawić uprawnienia do łańcucha folderów nadrzędnych, aby umożliwić selektywny dostęp do podfolderu. Mówienie, że to nie jedyna odpowiedź, to jak mówienie, że przejazd autobusem przez ścianę to kolejny sposób na zrobienie drzwi.
JMC