फ़ोल्डर और उसके सभी मूल निर्देशिकाओं के लिए अनुमतियाँ पढ़ें और लिखें


18

मुझे rootउपयोगकर्ता के लिए निर्देशिका subfolderNऔर उसके सभी मूल फ़ोल्डर तक पढ़ने और लिखने की अनुमति निर्धारित करने की आवश्यकता है root

मैं इसे हाथों से कर सकता हूं:

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

लेकिन अगर Nबड़ा हूं तो थक गया हूं। एक कमांड द्वारा स्वचालित रूप से कैसे करें?


आपको वास्तव में दुनिया को पठनीय नहीं बनाना चाहिए /root
स्टीफन चेज़लस

जवाबों:


23

यह शेल में आसानी से किया जा सकता है, उप में शुरू होता है और ऊपर की ओर बढ़ता है:

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

यह उस फ़ाइल / निर्देशिका के साथ शुरू होता है, जिसे आपने f भी सेट किया है, और प्रत्येक पैरेंट डायरेक्टरी पर काम करता है, जब तक कि उसका सामना "/" (या जो भी आप स्ट्रिंग को लूप की स्थिति में सेट करते हैं)। यह "/" को चोद नहीं करता है।


अच्छा, मुझे पता था कि मैं पर्ल के साथ बेकार की चीजों को उलझा रहा हूं।
terdon

लेकिन क्या होगा यदि fएक रिश्तेदार मार्ग है, और मैं उस पर रोकना चाहता हूं जो इसके बजाय रिश्तेदार है /?
सभी

@ स्टीफनचैलेजस धन्यवाद। अगर $fहै foo/bar, तो क्या $fकभी बदलेगा .? हाँ dirnameकरता है। धन्यवाद
StackExchange सभी के लिए

1
@Tim कमांड को 'f =` readlink -f <रिश्तेदार_path> `"
Talespin_Kit

6

साथ csh, tcsh, ksh, zsh, bash, fishया yash -o braceexpand:

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

के साथ zsh:

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

या आप एक ग्लोब क्वालीफायर फ़ंक्शन को परिभाषित कर सकते हैं जैसे:

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

उदाहरण के लिए उपयोग किया जाना है:

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

ध्यान दें कि chmod +rxumask से प्रभावित है। यदि आपका umaskशामिल नहीं है 007, तो यह /rootनिर्देशिका को विश्व-पठनीय और सुलभ बना देगा जो एक बुरा विचार है। /rootआम तौर पर सुपर-उपयोगकर्ता की निजी चीजों के लिए है, इसे उजागर करना एक बुरा विचार है।


आप क्या अग्रणी समझा सकते ,में {,/subfolder}है?
terdon

यह एक विकल्प बनाता है जहां पहला स्ट्रिंग खाली है और दूसरा है /subfolder; इसलिए /root{,/subfolder}पैदा करता है /rootऔर/root/subfolder
tripleee

विशेष रूप से यह POSIX के लिए पोर्टेबल नहीं हैsh
ट्रिपल

2

ठीक है, तुम कुछ और अधिक जटिल कर सकते हैं जैसे:

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

यह देखने के लिए कि chmodकॉल को प्रिंट के साथ क्या करना है :

$ 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

1

मुझे नहीं पता कि आप क्या करने की कोशिश कर रहे हैं, लेकिन बेहतर है कि आप पुनरावर्ती को हल्के में न लें । उस ने कहा, वास्तविक जवाब पढ़ें:

उम्म ... क्यों नहीं बस पुनरावर्ती का उपयोग करें।

sudo chmod -R +rx /root

या यदि आप इसे पसंद नहीं करते हैं, तो आप chmodकई निर्देशिका दे सकते हैं :

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN

4
यह लगभग एक ही ऑपरेशन नहीं है, हालांकि। नियमित फ़ाइलों और सभी निर्देशिकाओं के अंतर्गत - सब कुछchmod -R /root बदलता है । सवाल केवल निर्देशिका की एक श्रृंखला को बदलने के बारे में है। /root
200_सेफ़

@ 200_success लेकिन यह है कि केवल जवाब नहीं है;)
Braiam

सवाल पुनरावृत्ति के बारे में नहीं है, लेकिन एक सबफ़ोल्डर में चयनात्मक पहुंच की अनुमति देने के लिए माता-पिता फ़ोल्डरों की श्रृंखला पर अनुमतियाँ कैसे सेट करें। यह कहना कि यह एकमात्र उत्तर नहीं है, यह कहना है कि अपनी दीवार के माध्यम से बस चलाना एक दरवाजा बनाने का दूसरा तरीका है।
jmc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.