+ {} + ’को समाप्त करने के लिए 'find -exec cmd {} +’ की आवश्यकता क्यों है?


11

प्रस्तावना: मैं -exec {} \;और के बीच का अंतर समझता हूं -exec {} +। मुझे भी इस तरह की समस्या नहीं है , मैं सिर्फ शब्दार्थ के बारे में उत्सुक हूं find


इसके बजाय -execतर्क को समाप्त करते समय , हमें उदाहरण के लिए, इसे समाप्त करने की आवश्यकता है :+;{} +

# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"

# GNU find is even more cryptic:
$ find: missing argument to `-exec'

;इन उदाहरणों का उपयोग +ठीक काम करने के बजाय (लेकिन स्पष्ट रूप से कुछ और करता है)।

से POSIX :

-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +

... केवल एक <प्लस-साइन> जो तुरंत केवल दो वर्णों वाले एक तर्क का अनुसरण करता है " {}" प्राथमिक अभिव्यक्ति के अंत को रोक देगा। <Plus-sign> के अन्य उपयोगों को विशेष नहीं माना जाएगा।

दूसरे शब्दों में, का उपयोग करते समय +, कमांड को समाप्त करने की आवश्यकता होती है {} +

ऐसा क्यों है? और केवल और केवल क्यों +नहीं ;? पहले तो मैंने सोचा कि शायद फिल्नाम के साथ टकराव से बचा जाए जिसमें ए +, लेकिन ;ठीक काम करने के लिए फिल्नाम हैं? मुझे यह विश्वास करना कठिन है कि यह सीमा मनमाना है ...


3
FWIW, POSIX पेज यह भी कहता है कि The "-exec ... {} +" syntax adopted was a result of IEEE PASC Interpretation 1003.2 #210और उस दस्तावेज़ में आपको अधिक विवरण मिलेंगे, जैसे:Note that the "+" is only treated as special if it immediately follows "{}". This minimises the chances of causing problems with existing uses of "+" as an argument with "-exec".
don_crissti

जवाबों:


5

तर्क POSIX विनिर्देशन में दिए गए है:

"-exec ... {} +"वाक्य रचना अपनाया आईईईई PASC व्याख्या 1003.2 # 210 का परिणाम था। यह ध्यान दिया जाना चाहिए कि यह आईएसओ / आईईसी 9899: 1999 मानक के लिए एक असंगत परिवर्तन है। उदाहरण के लिए, निम्न कमांड सभी फाइलों को '-'उनके नाम के साथ प्रिंट करता है यदि वे नियमित फाइल हैं, और '+'अन्यथा:

find / -type f -exec echo {} - ';' -o -exec echo {} + ';'

परिवर्तन इस तरह उपयोग को अमान्य कर देता है। हालांकि पिछले मानक ने कहा था कि यह उपयोग काम करेगा, व्यवहार में कई ने इसका समर्थन नहीं किया और मानक डेवलपर्स ने अब यह बताना बेहतर समझा कि यह स्वीकार्य नहीं था।

PASC इंटरप्रिटेशन 1003.2 # 210 के इतिहास के बारे में अधिक विस्तार से बताता है -exec … {} +। पोसिक्स द्वारा अपनाए जाने से पहले यह कई यूनिक्स प्रणालियों पर मौजूद था; दोष रिपोर्ट इसे SVR4 में वापस भेजती है (जहाँ यह काफी हद तक अप्राप्य था)। दोष रिपोर्ट व्यवहार में कम प्रभाव के रूप में असंगत परिवर्तन को सही ठहराती है:

ध्यान दें कि "+" को केवल तभी विशेष माना जाता है यदि यह तुरंत "{}" का अनुसरण करता है। यह "-exec" के साथ एक तर्क के रूप में "+" के मौजूदा उपयोग के साथ समस्या पैदा करने की संभावना को कम करता है।

हालाँकि इसके लिए समर्थन जोड़ने से -exec … {} +कुछ अनुरूप अनुप्रयोग टूट जाएँगे, जैसे कि ऊपर दिए गए उदाहरण, यदि -exec … {} … +अनुमति दी गई है तो इनमें से कम हैं ।

एक और कारण, शायद, {}अंतिम तर्क को प्रतिबंधित करने के लिए कार्यान्वयन में आसानी है। यदि {}तर्क सूची में कहीं भी अनुमति दी गई थी -exec, तो findप्रोग्राम को स्टैटिक तर्कों की प्रतिलिपि बनाकर कमांड लाइन का निर्माण करना होगा, फिर वैरिएबल पार्ट, फिर एक अन्य स्टैटिक पार्ट। इससे तर्क सूची का निर्माण करना और आकार की सीमा का हिसाब लगाना कठिन हो जाएगा। कठिनाई न्यूनतम है, लेकिन कार्यान्वयनकर्ता कोनों में कटौती करना पसंद करते हैं। {}(यदि -exec {} foo +काम करना है, तो यह कई अपेक्षित उदाहरणों का समर्थन करता है, यह तार्किक रूप से उम्मीद की जा सकती है कि -exec {} foo {} +यह बहुत कठिन होगा)।

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