पुनरावर्ती फ़ाइल अनुमति नहीं बल्कि निर्देशिकाओं को बदलें?


13

मैं कुछ फ़ाइलों की अनुमतियों का एक बड़ा पुनरावर्ती परिवर्तन कर रहा था जो मैंने एक यूनिक्स प्रणाली में स्थानांतरित कर दिए थे। मैंने उन्हें बदलकर ug + rw कर दिया, लेकिन फिर मैंने पाया कि मैं उपनिर्देशिकाएँ नहीं बदल सकता। मैंने मैन पेज को देखा chmodऔर डायरेक्ट्री को बाहर करने के लिए कोई स्पष्टीकरण नहीं देखा, इसलिए मैंने थोड़ा गुगली की और पाया कि लोग findयूज़र और ग्रुप के लिए 'एक्जीक्यूट' करने के लिए डायरेक्ट्रीज़ पर अनुमतियों को बदल देते थे। मैंने ऐसा किया और फिर मैं उन पर गौर कर सकता था।

लेकिन यह मुझे लग रहा था कि मुझे यह पता करने में सक्षम होना चाहिए chmod- पढ़ने / लिखने के लिए फ़ाइलों को पुन: बदलने के लिए, लेकिन निर्देशिकाओं को अयोग्य बनाने के लिए नहीं। क्या मैंने इसे 'सही' तरीके से किया है या क्या इसे करने का कोई सरल तरीका है?

जवाबों:


12

बेहतर समाधान होना चाहिए

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

जहां पूंजी का Xअर्थ है: यदि निष्पादित बिट सेट

फ़ाइल एक निर्देशिका है या पहले से ही कुछ उपयोगकर्ता के लिए अनुमति निष्पादित है

( chmodमैन पेज से उद्धृत )।

या भी, यदि आप उपयोग करना चाहते हैं find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)

मैंने अपने USB हार्ड ड्राइव के लिए इस कमांड के सभी संस्करण के लिए विस्तृत ओपन का उपयोग किया: chmod -v -R ugo = rwX / path धन्यवाद!
यार

जाहिर है कि findसभी फ़ाइल अनुमतियों को 600 तक सेट करने का उपयोग किए बिना कोई रास्ता नहीं है और सभी निर्देशिका अनुमतियाँ 700 पर हैं। (मैं इस विषय पर अपने googlings के माध्यम से यहां पहुंचा हूं।) यदि यह एक ही आदेश के साथ किया जा सकता है chmod -R, तो मुझे सही करने के लिए स्वतंत्र महसूस करें।
वाइल्डकार्ड

@Wildcard: बिल्कुल नहीं, कमांड chmod -R u=rwX,go= /pathलगभग वही करता है जो आप चाहते हैं: यह सभी dirs को 700 पर सेट करता है और सभी फाइलें 600 या 700 पर निर्भर करती हैं, इस पर निर्भर करता है कि निष्पादन बिट पहले से सेट है या नहीं, और मुझे लगता है कि यह करना सही बात है ।
enzotib

1
@enzotib, हाँ-लगभग, लेकिन काफी नहीं। मेरे मामले में मैं सभी फाइलों के लिए निष्पादन बिट को अक्षम करना चाहता हूं (लेकिन निश्चित रूप से निर्देशिका नहीं) चाहे वे स्क्रिप्ट या बायनेरी हों या जो भी हों। इसलिए findआपके द्वारा लिखी गई कमांड टेम्पलेट के रूप में बहुत सहायक थी। :)
वाइल्डकार्ड

@Wildcard के बारे में क्या पहले निष्पादित बिट को हटाने के बारे में, पुनरावर्ती, फिर इसे केवल उपरोक्त कमांड का उपयोग करके निर्देशिकाओं में जोड़ें?
माइकल

3

खोज का उपयोग करना 'सही' तरीका है, और एकमात्र प्रोग्रामेटिक तरीका है, हालांकि विविधताएं हैं:

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

या

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

या सबसे धीमा:

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

इनमें से प्रत्येक एक फ़ाइल का चयन करता है (निर्देशिका नहीं, सिम्बलिन नहीं) और उस chmodपर कमांड लागू करता है। पहले दो chmodहर बार फ़ाइल को आंतरिक कमांड लाइन के अंत में जोड़कर कॉल की संख्या को कम करते हैं जब तक कि एक अधिकतम (अक्सर 10) तक नहीं पहुंच जाता है, फिर कमांड को कॉल करता है और एक नई कमांड का पुनर्निर्माण करना शुरू करता है। अंतिम कथन प्रत्येक फ़ाइल के लिए एक नई प्रक्रिया पैदा करता है, इसलिए यह कम कुशल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.