क्या चोमॉड को इंटरैक्टिव बनाने के लिए एक पंक्ति कमांड है?


24

मैं कुछ इस तरह की तलाश में हूँ:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

या समान सिंटैक्स।

अन्य आदेशों पर भी काम कर सकते हैं, जिनके लिए आपको व्यक्तिगत पुष्टि चाहिए।

जवाबों:


45

यह वही है जो आप देख रहे हैं:

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कमांड POSIX का उपयोग करके संगत बना सकते हैं -exec printf '%s\0' {} +। लगता है कि पूरी तरह से POSIX को संगत बनाने का कोई तरीका नहीं है।
l0b0

यह सिंटैक्स मुझे एक चेतावनी देता है, 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:।
हार्वे

@ हाईवे आप सही हैं: मैंने उस चेतावनी को हटाने के उत्तर को अपडेट कर दिया।
जॉन १०२४

25

आप उपयोग कर सकते हैं xargs

उदाहरण के लिए:

ls|xargs -I path -p chmod +x path

विकल्प -p: प्रत्येक कमांड लाइन को चलाने और टर्मिनल से एक लाइन पढ़ने के बारे में उपयोगकर्ता को संकेत दें। यदि प्रतिक्रिया 'y' या 'Y' से शुरू होती है तो केवल कमांड लाइन चलाएं।


1
+1 मुझे आपका उपयोग xargs -pइतना पसंद है कि मैं इसे कॉपी कर लूंगा।
जॉन १०२४

1
उत्तम! और किसी भी कमांड को इंटरेक्टिव बनाने का बहुत ही सरल तरीका। धन्यवाद।
हार्वे


@Kroltan - फ़ाइल नाम में कोई भी नई पंक्ति का उपयोग क्यों करेगा?
nbubis

1
@nbubis यह हो सकता है: एक टर्मिनल पर जाएं और टाइप करें touch "a very long file nameऔर एंटर दबाएं। लाइन निरंतरता देखें और बस समापन उद्धरण टाइप करें और फिर से एंटर करें। टाडा, फ़ाइल नाम में नयापन। आलस्य से बाहर एक लंबे फ़ाइल नाम को फिर से लिखने के लिए।
क्रॉल्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.