2010-01-14 6 views
10

में मैं एक फ़ोल्डर बाहर कर सकता हूँ कैसे आप एक फ़ोल्डर बाहर कर सकता हूँ जब फ़ाइल ऑपरेशनों को यानी सीपी आदिकैसे जब फ़ाइल ऑपरेशनों को यानी सीपी, mv, rm और chown आदि लिनक्स

मैं वाइल्ड कार्ड का उपयोग वर्तमान में हैं * सभी को फ़ाइल ऑपरेशन लागू करने के लिए, लेकिन मुझे एक एकल फ़ोल्डर को बाहर करने की आवश्यकता है।

कमांड मैं वास्तव में उपयोग करना चाहता हूं chown निर्देशिका में सभी फ़ाइलों के मालिक को बदलने के लिए है, लेकिन मुझे एक उप निर्देशिका को बाहर करने की आवश्यकता है।

+1

पार तैनात यहाँ: http://serverfault.com/questions/102729/how-do-i-exclude-a-folder-when-performing-file-operations-ie-cp-mv-rm -औंड-cho –

+0

मैंने मूल रूप से यहां पोस्ट किया लेकिन फिर मुझे यकीन नहीं था कि मैंने सही साइट पर ऐसा किया है, इसलिए मैंने बस सुनिश्चित करने के लिए दोबारा पोस्ट किया। – Camsoft

उत्तर

17

को बाहर आप बैश उपयोग कर रहे हैं और फिर आप !(<pattern>) उपयोग कर सकते हैं बाहर करने के लिए दिए गए shopt -s extglob के माध्यम से extglob सक्षम करने के लिए पैटर्न।

+2

की वजह से मैंने ऊपर दिए गए आदेश को निष्पादित किया है। क्या आप मुझे एक उदाहरण दे सकते हैं जो चोटी के साथ संयोजन में!() वाक्यविन्यास का उपयोग करता है? – Camsoft

+4

'चाउन 0755 -आर! (Foo)' –

+0

यह काम किया! एक और सवाल यह है कि बहिष्कृत फ़ाइल नाम दोबारा लागू किया जाएगा, ताकि यदि कोई निर्देशिका या फ़ाइल निर्देशिका फ़ाइल पेड़ में गहरी कहलाती है तो क्या उसे भी छोड़ दिया जाएगा? मैं केवल पहले foo को बाहर करना चाहता हूं जो शीर्ष स्तर फ़ोल्डर का प्रत्यक्ष वंशज है। – Camsoft

5
for file in *; do 
    if [ $file != "file_I_dont_want_to_chown" ] 
    then 
     chown -R Camsoft $file 
    fi 
done 
+1

आपको 'ls' की आवश्यकता नहीं है। बस '' –

+1

में फ़ाइल के लिए' का उपयोग करें, – danben

+1

परिवर्तन को कम से कम एक शश के लिए आपको लूप शुरू करने के लिए 'do' की आवश्यकता होगी। – user569825

2

यूनिक्स के कई छोटे तेज औजार संयुक्त करें: फ़ोल्डर "foo"

% ls -d * | grep -v foo | xargs -d "\n" chown -R Camsoft 
+0

क्या यह उप-निर्देशिकाओं में ड्रिलिंग, फिर से काम करेगा? – Camsoft

+0

'-0' यहां कुछ भी नहीं पूरा करता है। –

+0

अब यह फिर से काम करेगा कि मैंने "-आर" जोड़ा है। –

0

एक और विकल्प अस्थायी रूप से उस फ़ाइल/फ़ोल्डर पर अनुमति को हटाने के लिए हो सकता है।
यूनिक्स में आपको इसे दर्ज करने के लिए निर्देशिका पर 'x' अनुमति की आवश्यकता है।

संपादित करें: जाहिर है कि यदि आप लाइव उत्पादन डेटाबेस का बैक अप ले रहे हैं तो यह काम पर जाने के लिए नहीं है - लेकिन यूएसबी कुंजी पर दस्तावेजों की प्रतिलिपि बनाते समय अपनी 'रोचक छवियों' संग्रह को छोड़कर यह पुन: प्रयोज्य है।

+0

दुर्भाग्यवश जिस निर्देशिका को मैं बाहर करना चाहता हूं वह एक कर्ट फ़ोल्डर है और इस की अनुमति को गड़बड़ करने से हमारे HTTPS अनुरोधों को तोड़ दिया जाएगा। – Camsoft

+0

पर्याप्त मेला - यह कभी-कभी समाधान जटिल रेगेक्स/xargs कथन से सरल होता है ;-) –

6
find dir_to_start -name dir_to_exclude -prune -o -print0 | xargs -0 chown owner 

find dir_to_start -not -name "file_to_exclude" -print0 | xargs -0 chown owner 
+0

+1 मुझे यह पारंपरिक विधि पसंद है। –

1

इस स्थिति के लिए मैं खोज का उपयोग करने की सलाह दूंगा। आप -not -iwhilename 'पथ' का उपयोग करके बाहर निकलने के लिए पथ निर्दिष्ट कर सकते हैं। तब कार्यकारी का उपयोग कर आप कमांड आप निष्पादित करने के लिए

find . -not -iwholename './var/foo*' -exec chown www-data '{}' \; 

हालांकि यह शायद अपनी स्थिति के लिए मदद करता है मैं भी स्क्रिप्ट अपरिवर्तनीय ध्वज सेट को देखने की है चाहते निष्पादित। सुनिश्चित करें कि जब आप अपना काम करते हैं तो फ्लैग को हटा दें, अगर स्क्रिप्ट को जल्दी मार दिया जाता है तो आपको इसके लिए जाल का उपयोग करना चाहिए (नोट: स्क्रिप्ट से चलाएं, बैश सत्र निकलने पर जाल कोड चलाता है)। मेरे विकल्प में बहुत परेशानी है लेकिन कुछ स्थितियों में यह अच्छा है।

cd /var 
trap 'chattr -R -i foo > /dev/null 2>&1' 0 
chattr -R +i foo 
chown -R www-data * 
संबंधित मुद्दे