जवाबों:
यह वही है जो आप देख रहे हैं:
find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
इसके find
बजाय इसका उपयोग करता है ls
, क्योंकि आम तौर पर, पार्सिंग ls
आउटपुट अविश्वसनीय है । find
हालाँकि, यह फ़ॉर्म, फ़ाइल नाम के साथ काम करेगा, भले ही वे नए वर्ण या अन्य कठिन वर्ण हों।
व्याख्या
find . -maxdepth 1 -type f -print0
यह फ़ाइलों का चयन करता है। यह किसी भी खोज के कई विकल्पों का उपयोग करके अनुकूलित किया जा सकता है। विकल्प फ़ाइल नामों को अशक्त-पृथक सूची में मुद्रित करने के लिए print0
कहता find
है। फ़ाइल नामों की सूचियों को प्रसारित करने के लिए यह एकमात्र विश्वसनीय है।
xargs -L1 -p0 chmod +x
इससे उत्पन्न फ़ाइल नामों की अशक्त-पृथक सूची बन जाती है find
और आपकी आज्ञा उन पर लागू होती है।
-L1
विकल्प बताता है xargs
एक समय में केवल एक फ़ाइल नाम पर काम करने के लिए। -p
विकल्प बताता xargs
जारी रखने से पहले अनुमोदन के लिए शीघ्र करने के लिए। -0
विकल्प बताता है xargs
फ़ाइल नाम के बीच सीमांकक नल केरेक्टर उपयोग करने के लिए।
[मैं इस -p
विकल्प से अनजान था xargs
जब तक @kwan ने इसे इंगित नहीं किया।]
find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
इसलिए यह -maxdepth 1
पहले के साथ काम करता है -type f
, जैसे find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
:।
आप उपयोग कर सकते हैं xargs
।
उदाहरण के लिए:
ls|xargs -I path -p chmod +x path
विकल्प -p
: प्रत्येक कमांड लाइन को चलाने और टर्मिनल से एक लाइन पढ़ने के बारे में उपयोगकर्ता को संकेत दें। यदि प्रतिक्रिया 'y' या 'Y' से शुरू होती है तो केवल कमांड लाइन चलाएं।
xargs -p
इतना पसंद है कि मैं इसे कॉपी कर लूंगा।
touch "a very long file name
और एंटर दबाएं। लाइन निरंतरता देखें और बस समापन उद्धरण टाइप करें और फिर से एंटर करें। टाडा, फ़ाइल नाम में नयापन। आलस्य से बाहर एक लंबे फ़ाइल नाम को फिर से लिखने के लिए।
find
कमांड POSIX का उपयोग करके संगत बना सकते हैं-exec printf '%s\0' {} +
। लगता है कि पूरी तरह से POSIX को संगत बनाने का कोई तरीका नहीं है।