chmod हजारों फाइलों पर पुनरावर्ती अनुमति देता है


16

यह पुनरावर्ती 'चामोइंग' के बारे में अधिक सामान्य प्रश्न है।

मेरे पास यह स्क्रिप्ट है जो किसी बिंदु पर अनुमतियों को एक फ़ोल्डर में पुनरावृत्ति को बदलने की आवश्यकता है जिसमें कुछ सौ हजार फाइलें हैं। उस फ़ोल्डर में हर दिन नई फाइलें जोड़ी जाती हैं, लेकिन जो पहले से मौजूद हैं उनके पास पहले से ही अनुमतियाँ हैं और वे नहीं बदलते हैं।

मेरा सवाल है ... जब मैं फोन करता हूं

चामोद 775। आर

क्या यह उन फ़ाइलों के लिए अनुमति सेट करने का प्रयास करता है जिनके पास पहले से ही सही अनुमतियाँ सेट हैं, या केवल नई फ़ाइलों के लिए जिनके पास सही अनुमतियाँ नहीं हैं?

ऐसा लगता है कि स्क्रिप्ट में इस आदेश को प्राप्त करने के लिए हमेशा उम्र लगती है, भले ही 'नई' फाइलें केवल कुछ हजार हों और यह उनकी अनुमतियों को जल्दी से करना चाहिए।

मैं chmod के लिए मैन पेज देखा है, लेकिन यह इस मामले पर कुछ भी उल्लेख नहीं लगता है।

यदि चामोद पहले से अनुमति के लिए जाँच नहीं करता है, तो क्या मुझे 'चोद' के साथ 'खोजने' के संयोजन को देखना शुरू करना चाहिए?


3
मुझे आश्चर्य है कि अगर यह अनुमतियों की जांच करने और उन्हें बदलने के लिए बहुत धीमी है, तो यदि वे सीधे सही मूल्य पर सही सेट नहीं करते हैं।
लार्जेट

1
अगर कोई भी इस पर ठोकर खाता है और वह ढूंढता है + chmod कमांड, यहाँ यह है: खोजें। ! -स्पर्म 775 -प्रिंट 0 | xargs -0 -I {} chmod 775 {}
टिटी डुमी

@lgeorget, तो आप कह रहे हैं कि यह खोजने के लिए धीमी है? सब कुछ चोदने के लिए। (क्षमा करें, आपकी टिप्पणी से समझ में नहीं आया)। चीयर्स
टिटी डुमी

मेरी विनम्र राय में, यह शायद धीमा है क्योंकि इसे दो प्रक्रियाओं की सराहना करने और पहले एक के उत्पादन को दूसरे पर पुनर्निर्देशित करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है। यह अनुमतियों को सेट करने में लगने वाले समय पर निर्भर करता है, जो कि महत्वपूर्ण नहीं हो सकता है क्योंकि वे इनकोड को संशोधित करने के लिए सिर्फ 3 बाइट्स हैं।
16

1
@depquid मुख्य प्रदर्शन समस्या यहाँ डिस्क कैश में डेटा पढ़ रही है। पहले रन के बाद सब कुछ डिस्क कैश में है (जब तक कि बहुत कम मेमोरी नहीं है) इस प्रकार आप किसी चीज के प्रदर्शन का परीक्षण कर रहे हैं जो वास्तविक स्थिति में अड़चन नहीं है।
हौके लैगिंग

जवाबों:


9

chmodउन फ़ाइलों की अनुमतियों को बदल सकता है या नहीं बदल सकता है जो पहले से ही सेट हैं जो आप चाहते हैं, लेकिन यदि नहीं, तो भी उन्हें यह देखने के लिए जांचने की आवश्यकता होगी कि उनकी वर्तमान अनुमतियाँ क्या हैं [0]। सैकड़ों हजारों फाइलों के साथ, मुझे नहीं लगता कि यह किसी भी तरह से मायने रखेगा; समय की सबसे अधिक संभावना है कि उपकरण statहर फाइल को आईएनजी द्वारा खर्च कर रहे हैं।

आप findअंतिम रन की तुलना में नई फ़ाइलों के लिए या तो जाँच करने की कोशिश कर सकते हैं या जिन फ़ाइलों chmodको चलाने की आवश्यकता होती है, लेकिन मुझे नहीं लगता कि आपको बहुत गति में सुधार मिलेगा।

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

[०] यहां तक ​​कि अगर यह उन फाइलों की अनुमति देने का प्रयास करता है जिन्हें किसी भी बदलाव की आवश्यकता नहीं है, तो अंतर्निहित फाइल सिस्टम शायद अनुरोध के साथ कुछ भी नहीं करेगा, क्योंकि यह अनावश्यक है।


उसके लिए धन्यवाद। मैं खोजने की कोशिश करूंगा | chmod संस्करण और देखें कि क्या यह चीजों को तेज करता है। यदि नहीं तो मैं आपके द्वारा सुझाए अनुसार 'होल्डिंग' फ़ोल्डर को लागू करने के लिए स्क्रिप्ट को संशोधित करने का प्रयास करूंगा।
तैती दम

आपको गति में सुधार नहीं होने का कारण यह होगा कि इनोड को समय और पहुँच अधिकार दोनों के लिए पढ़ा जाना है।
हौके लागिंग

10

/ chmod अनुकूलन खोजें

दोनों findऔर chmodपढ़ने के लिए

  1. सभी निर्देशिका प्रविष्टियाँ
  2. इन सभी प्रविष्टियों के लिए इनकोड

आपको शायद सभी प्रविष्टियों को पढ़ने और फिर सभी इनोड्स (एक घूर्णन डिस्क पर) पढ़ने से प्रदर्शन में सुधार होता है क्योंकि तब डिस्क हेड डायरेक्टरी और इनोड्स के बीच नहीं चलती है)। जैसा chmod कि बेवकूफ है (जैसा कि अन्य उत्तरों में से एक बताते हैं) इसे findकेवल के माध्यम से बुलाया जाना चाहिए । लेकिन फिर भी यह पहले लिखे जाने से पहले सभी आयतों को पढ़ने में मदद कर सकता है (यह मानते हुए कि आपके पास डिस्क कैश के लिए पर्याप्त मुफ्त रैम है)। मैं यह सुझाव देता हूं:

find . -printf "" # reading the file names only
find . ! -perm 775 -printf "" # reading all the inodes (file names are cached)
find . ! -perm 775 -exec chmod 775 + # writing to the cache without reading from disk

अच्छा समाधान: ACLs

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

फाइलसिस्टम ऑप्टिमाइज़ेशन द्वारा और सुधार लाया जा सकता है। यदि यह ext3 / ext4 है तो आप e2fsck -Dसमय-समय पर चला सकते हैं । शायद यह इस निर्देशिका को एक अलग वॉल्यूम पर रखने में मदद करता है। आप अलग-अलग फाइल सिस्टम या फाइलसिस्टम सेटिंग्स (जैसे अलग-अलग इनोड साइज) आजमा सकते हैं।


जब तक आप NFSv4 माउंट पर काम नहीं कर रहे हैं तब तक ACL अच्छे हैं।
ओस्ट्रोकैच

findसमाधान के बारे में मेरा समय दोगुनी हो, chmodएक डोकर कंटेनर के अंदर ing।
नाथन रीनटोमोनिका आर्थर

8

के उपयोग मान लिया जाये chmodसे GNU coreutils पैकेज उबंटू 12.10 पर।

chmod 775 . -Rfchmodatप्रत्येक फ़ाइल के लिए सिस्टम कॉल को निष्पादित करता है जो यह पता लगाता है कि अनुमतियों को बदलने की आवश्यकता है या नहीं। मैंने strace chmod 775 . -Rवास्तविक व्यवहार को सूचीबद्ध करने के लिए कोड का निरीक्षण और नीचे (स्निपेट) का उपयोग करके दोनों की पुष्टि की ।

newfstatat(4, "d", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "d", 0775)                  = 0
newfstatat(4, "c", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "c", 0775)                  = 0
newfstatat(4, "a", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "a", 0775)                  = 0
newfstatat(4, "b", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "b", 0775)                  = 0

fchmodatप्रत्येक फ़ाइल पर चलने के कुछ नुकसान हैं

  • यदि बड़ी संख्या में फ़ाइलें बदली जाती हैं, तो अतिरिक्त सिस्टम कॉल महत्वपूर्ण हो जाएगा। find/ xargs/ chmodविधि दूसरों के द्वारा उल्लेख होने की संभावना ही नहीं बदल रहा है की जरूरत फ़ाइलों को बदलने के द्वारा तेज हो जाएगा।
  • fchmodatप्रत्येक फ़ाइल के फ़ाइल स्थिति संशोधन (CIME) को बदलने के लिए कॉल । यह प्रत्येक फ़ाइल / इनकोड को हर बार बदलने का कारण बनेगा और संभवतः अतिरिक्त डिस्क लिखने का कारण होगा। इन अतिरिक्त लेखन को रोकने के लिए माउंट विकल्पों का उपयोग करना संभव हो सकता है।

एक सरल प्रयोग सीधे समय के लिए हो रहे समय परिवर्तन को दर्शाता है chmod

auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 d
auser@duncow:/tmp/blah.test$ chmod 775 . -R
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d

लेकिन यह कुछ मिनटों के लिए find/ xargs/ नहीं बदलता हैchmod

auser@duncow:/tmp/blah.test$ date
Tue Jun 18 18:27:27 BST 2013
auser@duncow:/tmp/blah.test$ find . ! -perm 775 -print0 | xargs -0 -I {} chmod 775 {}
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d

मैं हमेशा find/ xargs/ chmodसंस्करण का उपयोग करना चाहूंगा क्योंकि खोजने से चीजों का चयन करने पर अधिक नियंत्रण मिलता है।


1

[स्रोत] (1) दिखाता है, कि chmod(1)हमेशा मोड सेट करने की कोशिश करता है और फिर [fstatat (2)] (2) के साथ फिर से जाँच करता है।

फ़ाइलों को [fts (3)] (3) के माध्यम से संसाधित किया जाता है, जिसे अपने डेटा ट्री को बनाने के लिए सभी ट्रैवर्स किए गए फ़ाइल सिस्टम ऑब्जेक्ट को 'स्टेट' करना होता है।

Unixlore में एक [अच्छा लेख] (4) है जहाँ chmod(1)एक find/ xargsदृष्टिकोण के खिलाफ समयबद्धता है : बाद वाले परिमाण द्वारा जीतता है।

यहाँ कमांड लाइन मूल प्रश्न के अनुकूल है:

find . -print0 | xargs -0 chmod 775

दो कारण:

  1. फ़ाइल सिस्टम ट्रैवर्सल को दो प्रक्रियाओं के बीच पाइप के माध्यम से फाइलों पर होने वाले संचालन से अलग किया जाता है, जो अलग-अलग कोर पर भी चल सकता है।

    1. fts(3)ऑपरेशन को छोटा किया जाता है, क्योंकि xargs(1)डायरेक्टरी ट्री को 'फ्लैटेंस' कर दिया जाता है।

तो हाँ: आपको निश्चित रूप से उपयोग करना चाहिए find/ xargs। एक सरल समाधान के लिए।

अन्य विकल्प:

  • [Umask] (5) और नई फ़ाइलों को लिखने की प्रक्रिया के स्रोत कोड के साथ चलाएं।

  • यदि आप लिनक्स का उपयोग कर रहे हैं, तो संभावना है कि आपके सिस्टम ने inotifyकर्नेल सबसिस्टम को सक्षम किया है । इस मामले में, आप [inotifywait (1)] (6) के माध्यम से एक कुशल समाधान को स्क्रिप्ट कर सकते हैं।


Sidenote: जब तक आप अपनी फ़ाइलों पर अनुमतियाँ निष्पादित नहीं करना चाहते हैं, तब तक मैं आह्वान को संशोधित करने का सुझाव दूंगा:

find . -type f -print0 | xargs -0 chmod 664
find . -type d -print0 | xargs -0 chmod 775

संपादकों को ध्यान दें: मुझे पोस्ट में अधिक लिंक जोड़ने की अनुमति नहीं है, न ही अन्य पोस्ट पर टिप्पणी करने के लिए। मैं यहाँ url छोड़ता हूँ और आशा करता हूँ कि कुछ खुले हुए उपयोगकर्ता पर्याप्त प्रतिष्ठा के साथ उन्हें पाठ में वापस डाल देंगे और इस पैराग्राफ को हटा देंगे।


इसके साथ डिस्क कैश को भड़काने पर टिप्पणी करेंfind . -printf "" :

यह निम्नलिखित chmodकार्यों के निष्पादन में तेजी ला सकता है , हालांकि उपलब्ध स्मृति और i / o भार पर निर्भर करता है। तो यह काम कर सकता है, या नहीं। ट्रूकॉलरिंग ( find) और chmodऑपरेशन पहले से ही कैशिंग के लिए प्रदान करता है, इसलिए कैश को भड़काना अतिरेक हो सकता है।

  1. https + lingrok.org / xref / coreutils / src / chmod.c # process_file
  2. https + linux.die.net / आदमी / 2 / fstatat
  3. https + linux.die.net / आदमी / 3 / fts
  4. http + www.unixlore.net / लेख / तेज-अप-बल्क-फ़ाइल-operations.html
  5. https + en.wikipedia.org / wiki / umask
  6. https + linux.die.net / आदमी / 1 / inotifywait

0

क्या आपने उस प्रक्रिया (तों) को बदलने पर विचार किया है जो उन्हें 0775 मोड के साथ बनाने के लिए फाइल बनाती है? पर्यावरण में umask मूल्य को देखें - 0002 मदद कर सकता है।

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