आपकी कमांड पहले शेल द्वारा दो कमांडों द्वारा अलग की गई है ;
, जो एक नई रेखा के बराबर है:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
यदि आप एक शेल कमांड चलाना चाहते हैं, तो एक शेल को स्पष्ट रूप से संलग्न करें bash -c
(या sh -c
यदि आपको परवाह नहीं है कि शेल विशेष रूप से बैश है):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
{}
शेल के तर्क के रूप में उपयोग पर ध्यान दें ; यह शून्य तर्क है (जो आमतौर पर शेल या स्क्रिप्ट का नाम है, लेकिन यह यहां कोई फर्क नहीं पड़ता), इसलिए इसे संदर्भित किया जाता है "$0"
।
आप एक बार में शेल में कई फ़ाइल नाम पास कर सकते हैं और शेल को उनके माध्यम से पुनरावृत्त कर सकते हैं, यह तेज़ हो जाएगा। यहां मैं _
स्क्रिप्ट नाम के रूप में पास करता हूं और निम्नलिखित तर्क फ़ाइल नाम हैं, जो for x
(के लिए एक शॉर्टकट for x in "$@"
) से अधिक पुनरावृत्त करता है।
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
ध्यान दें कि बैश 4 के बाद से, या zsh में, आपको यहां बिल्कुल भी खोजने की आवश्यकता नहीं है। बैश में, एक पुनरावर्ती निर्देशिका ग्लोब के लिए खड़े होने को सक्रिय करने के लिए चलाएं shopt -s globstar
(इसे अपने में डालें ~/.bashrc
) **/
। (Zsh में, यह हर समय सक्रिय है।) फिर
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
या यदि आप चाहते हैं कि फाइलों को क्रम में पुनरावृत्त किया जाए
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
find
कमांड के साथ एक अंतर यह है कि शेल डॉट फाइल्स (जिन फाइलों का नाम ए से शुरू होता है .
) को अनदेखा करता है । उन्हें शामिल करने के लिए, बैश में, पहले सेट GLOBIGNORE=.:..
; zsh में, **/*(D)
ग्लोब पैटर्न के रूप में उपयोग करें ।
'{}'
(ब्रेसिज़ के चारों ओर एपोस्ट्रोफ़्स), कृपया देखें: unix.stackexchange.com/q/8647/4485