सवाल फ़ाइलों को छोड़कर सभी निर्देशिकाओं को दोबारा कैसे घुमाएं?


कैसे 755 सभी निर्देशिका chmod करने के लिए लेकिन कोई फ़ाइल (recursively)?

उलटा, कैसे केवल फाइलों को chmod करने के लिए (recursively) लेकिन कोई निर्देशिका नहीं?


528
2018-01-06 01:56


मूल


सम्बंधित: निर्देशिका के सभी फ़ाइलों और फ़ोल्डर अनुमतियों को 644/755 में बदलें एसओ पर - kenorb
सम्बंधित: एक आदेश के साथ सभी फ़ोल्डर अनुमतियों को बदलें U & एल में - Scott


जवाब:


दोबारा देने के लिए निर्देशिका विशेषाधिकार पढ़ें और निष्पादित करें:

find /path/to/base/dir -type d -exec chmod 755 {} +

दोबारा देने के लिए फ़ाइलें विशेषाधिकार पढ़ें:

find /path/to/base/dir -type f -exec chmod 644 {} +

या, यदि प्रक्रिया करने के लिए कई वस्तुएं हैं:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

या, कम करने के लिए chmod स्पॉन:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644

736
2018-01-06 01:58



पहले दो उदाहरण निर्देशिकाओं के लिए बहुत अधिक फाइलों के साथ विफल: -bash: /bin/chmod: Argument list too long। अंतिम आदेश कई फ़ाइलों के साथ काम करता है, लेकिन उपयोग करते समय sudo किसी को chmod के बजाय xargs से पहले इसे रखने के लिए सावधान रहना चाहिए: find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755 - Agargara
यह भी ध्यान रखें, ये आदेश हैं सम्मिलित आधार डीआईआर के। तो उपर्युक्त उदाहरण में, dir 755 पर भी सेट किया जाएगा। - CenterOrbit
chmod ... $(find /path/to/base/dir -type ...) नाम में रिक्त स्थान के साथ फ़ाइल नामों के लिए विफल रहता है। - Dan Dascalescu
मुझे लगता है कि फाइलनामों और फाइलों की संख्या में रिक्त स्थान और प्रतीकों के संबंध में सबसे सही (लेकिन सबसे तेज़ नहीं) संस्करण है find /path/to/base/dir -type d -exec chmod 755 {} \; (find /path/to/base/dir -type f -exec chmod 644 {} \;)। - Peter K


इस तरह की चीज का एक आम कारण निर्देशिका को 755 पर सेट करना है, लेकिन 644 फाइलें हैं। इस मामले में निक के मुकाबले थोड़ा तेज तरीका है find उदाहरण:

chmod -R u+rwX,go+rX,go-w /path

अर्थ:

  • -R = पुनरावर्ती;
  • u+rwX = उपयोगकर्ता पढ़ सकते हैं, लिख सकते हैं और निष्पादित कर सकते हैं;
  • go+rX = समूह और अन्य पढ़ और निष्पादित कर सकते हैं;
  • go-w = समूह और अन्य लिख नहीं सकते हैं

यहां ध्यान देने योग्य महत्वपूर्ण बात यह है कि अपरकेस X लोअरकेस के लिए अलग-अलग कार्य करता है x। मैनुअल में हम पढ़ सकते हैं:

निष्पादन / खोज बिट्स अगर फ़ाइल निर्देशिका है या निष्पादन / खोज बिट्स में से कोई भी मूल (अनमोडिफाइड) मोड में सेट है।

दूसरे शब्दों में, फ़ाइल पर chmod u + X निष्पादित बिट सेट नहीं करेगा; और जी + एक्स केवल तभी सेट होगा जब यह पहले से ही उपयोगकर्ता के लिए सेट हो।


265
2018-01-06 03:22



-आर = पुनरावर्ती; u + rwX = उपयोगकर्ता पढ़ सकते हैं, लिख सकते हैं और निष्पादित कर सकते हैं; जाओ + आरएक्स = समूह और अन्य पढ़ और निष्पादित कर सकते हैं; go-w = समूह और अन्य लिख नहीं सकते हैं - släcker
जब कोई व्यक्ति करता है तो यह पैटर्न स्थिति को ठीक नहीं करेगा chmod -R 777 के बाद से +X विकल्प फ़ाइलों पर मौजूदा निष्पादन बिट्स को रीसेट नहीं करेगा। -X का उपयोग निर्देशिका को रीसेट करेगा, और उनमें उतरने से रोक देगा। - Andrew Vit
@ ring0: मैं सचमुच सवाल का जवाब देने का इरादा नहीं कर रहा हूं - निक ने पहले से ही पूरी तरह से किया है। मैं सबसे आम मामले के लिए एक सस्ता समाधान इंगित कर रहा हूँ। और हाँ, आपको फ़ाइलों और निर्देशिकाओं के साथ अलग-अलग अनुमतियां मिलती हैं Xजैसा कि टिप्पणियों में बताया गया है। - bobince
go+rX,go-w -> go=rX है ना? - Pierre de LESPINAY
आप भी उपयोग कर सकते हैं chmod u-x,u+X संयोजन में, आदि, फ़ाइलों के लिए निष्पादित बिट्स को हटाने के लिए, लेकिन निर्देशिकाओं के लिए उन्हें जोड़ें। - w0rp


यदि आप यह सुनिश्चित करना चाहते हैं कि फ़ाइलों को 644 पर सेट किया गया है और पथ में फ़ाइलें हैं जिनमें निष्पादित ध्वज है, तो आपको पहले निष्पादन ध्वज को हटाना होगा। + एक्स उन फ़ाइलों से निष्पादित ध्वज को नहीं हटाता है जो पहले से ही हैं।

उदाहरण:

chmod -R ugo-x,u+rwX,go+rX,go-w path

अद्यतन: यह असफल प्रतीत होता है क्योंकि पहला परिवर्तन (ugo-x) निर्देशिका को अप्राप्य बनाता है, इसलिए इसके नीचे की सभी फ़ाइलें बदली नहीं जाती हैं।


12
2018-01-22 16:14



यह मेरे लिए काम करता है, और मुझे नहीं लगता कि यह क्यों नहीं होगा। (निश्चित रूप से, अगर आपने अभी किया था chmod -R ugo-x path, यह एक समस्या हो सकती है। लेकिन पूरा आदेश करेगा chmod u+rwX प्रत्येक निर्देशिका पर इससे पहले उतरने की कोशिश की जाती है।) हालांकि, मुझे विश्वास है chmod R u=rw,go=r,a+X path पर्याप्त है - और यह छोटा है। - Scott
मैंने पाया कि यह ठीक से काम करता है; निर्देशिका में प्रवेश करने के साथ कोई समस्या नहीं थी - Someone Somewhere


मैंने खुद के लिए एक छोटी सी लिपि लिखने का फैसला किया।

डीआईआरएस और / या फाइलों के लिए रिकर्सिव chmod स्क्रिप्ट - जिस्ट

यह मूल रूप से रिकर्सिव chmod करता है लेकिन कमांड लाइन विकल्पों के लिए थोड़ा लचीलापन भी प्रदान करता है (सेट निर्देशिका और / या फ़ाइल अनुमतियां, या दोनों को छोड़कर यह सब कुछ स्वचालित रूप से 755-644 पर रीसेट करता है)। यह कुछ त्रुटि परिदृश्यों के लिए भी जांच करता है।

मैंने इसके बारे में भी लिखा था मेरे ब्लॉग पर


4
2017-09-18 14:00





दोबारा देने के लिए निर्देशिका विशेषाधिकार पढ़ें और निष्पादित करें:

find /path/to/base/dir -type d -exec chmod 755 {} \;

दोबारा देने के लिए फ़ाइलें विशेषाधिकार पढ़ें:

find /path/to/base/dir -type f -exec chmod 644 {} \;

मुझे सहीता के पक्ष में निक के जवाब को अपग्रेड करने की तुलना में बेहतर देर से नहीं। मेरा समाधान धीमा है, लेकिन यह फ़ाइल नामों में किसी भी प्रतीक के साथ किसी भी फाइल के साथ काम करता है, और आप इसे सामान्य रूप से सुडो के साथ चला सकते हैं (लेकिन सावधान रहें कि यह सूडो के साथ विभिन्न फाइलों को खोज सकता है)।


2
2018-02-21 11:58



यह है एक ढाल का निक का जवाब। आप क्यों मानते हैं कि निक के जवाब में कुछ भी गलत है? - Scott
@ स्कॉट, निक का जवाब बड़ी संख्या में फाइलों (vey) के साथ विफल रहता है। - Peter K
मुझे 99% यकीन है कि आप गलत हैं। क्या आप अपने दावे का समर्थन करने के लिए कोई साक्ष्य प्रदान कर सकते हैं? - Scott
हाँ, ऐसा लगता है कि मैं वास्तव में गलत हूँ। लगता है ... + कई आदेशों में लाइन को तोड़ने लगता है, अच्छा पकड़! - Peter K


इस पायथन लिपि का प्रयास करें; इसके लिए प्रक्रियाओं की कोई आवश्यकता नहीं होती है और प्रति फ़ाइल केवल दो सिस्कोल करता है। सी में कार्यान्वयन के अलावा, यह संभवतः इसे करने का सबसे तेज़ तरीका होगा (मुझे 15 मिलियन फाइलों के फाइल सिस्टम को ठीक करने की आवश्यकता है जो सभी 777 पर सेट किए गए थे)

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

मेरे मामले में, आखिरी chmod के आसपास एक कोशिश / पकड़ की आवश्यकता थी, क्योंकि कुछ विशेष फाइलों को chmodding विफल रहा।


0
2018-03-26 04:37





आप भी उपयोग कर सकते हैं tree:

tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1"' -- '{}'

और यदि आप फ़ोल्डर को एक गूंज जोड़ना भी देखना चाहते हैं

 tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1" && echo$1' -- '{}'

-1
2018-02-16 09:34



@ स्कॉट 1) आप सही हैं + एक्स मैं 755 में बदल गया; 2) 3) इसे हल करने के लिए मैंने प्लेसहोल्डर को एक ही उद्धरण में रखा है जैसे कि '{}' - Eduard Florinescu
@ स्कॉट मैं मानता हूं कि यह सबसे अच्छा जवाब भी धीमा नहीं है लेकिन यहां "व्यावहारिक" उद्देश्यों के लिए यहां जायेगा, टिप्पणियां भी आगे की व्याख्या करेंगी, लोग भी इसके बारे में जान सकते हैं xargs मुद्दे। फ़ाइल नामों में एकल उद्धरण स्वयं कई आदेशों और लिपि के लिए एक समस्या है इसलिए मैंने एकल फाइलों वाली सभी फाइलों को सूचीबद्ध किया और उन्हें हटा दिया (उद्धरण का मतलब है) - Eduard Florinescu
@Scott मेरे सिस्टम पर मैंने उन सभी फ़ाइलों की खोज की जिनमें सिंगल कोट्स शामिल थे और सिंगल कोट्स को प्रतिस्थापित किया गया था - Eduard Florinescu
@ स्कॉट आप इस तथ्य को कैसे ठीक करेंगे कि xargs एकल कोट्स को सही ढंग से हल नहीं करता है? - Eduard Florinescu
हमें करने दो बातचीत में इस चर्चा को जारी रखें। - Eduard Florinescu


आप उदाहरण के रूप में निम्न बैश स्क्रिप्ट का उपयोग कर सकते हैं। इसे निष्पादन योग्य अनुमतियां देना सुनिश्चित करें (755)। वर्तमान निर्देशिका के लिए बस ./autochmod.sh का उपयोग करें, या ./autochmod.sh <dir> एक अलग निर्दिष्ट करने के लिए।

#!/bin/bash

if [ -e $1 ]; then
    if [ -d $1 ];then
        dir=$1
    else
        echo "No such directory: $1"
        exit
    fi
else
    dir="./"
fi

for f in $(ls -l $dir | awk '{print $8}'); do
    if [ -d $f ];then
        chmod 755 $f
    else
        chmod 644 $f
    fi
done

-2
2018-01-29 11:56



वाह! इतनी सारी समस्याएं! (1) अगर $1 शून्य नहीं है, लेकिन निर्देशिका का नाम नहीं है (उदा।, एक टाइपो है), फिर dir पर सेट हो जाता है . बिना संदेश के। (2) $1 होना चाहिए "$1" तथा $dir होना चाहिए "$dir"। (3) आपको कहने की जरूरत नहीं है "./"; "." ठीक है (और, कड़ाई से बोलते हुए, आपको यहां उद्धरण की आवश्यकता नहीं है)। (4) यह एक पुनरावर्ती समाधान नहीं है। (5) मेरे सिस्टम पर, ls -l … | awk '{ print $8 }' फाइलों के संशोधन के समय हो जाता है। आप की जरूरत है { print $9 } लेना का पहला शब्द फ़ाइल नाम और फिर भी, (6) यह सफेद जगह के साथ फ़ाइल नाम संभाल नहीं करता है। ... - Scott
... और, अंतिम लेकिन कम से कम नहीं (∞) यदि यह स्क्रिप्ट वर्तमान निर्देशिका में है, तो यह होगा chmod  अपने आप 644 तक, इस प्रकार खुद को निष्पादन योग्य बनाते हैं! - Scott