जवाबों:
गति का अंतर महत्वहीन होगा।
लेकिन आपको यह सुनिश्चित करना होगा कि:
आपकी स्क्रिप्ट यह नहीं मानेगी कि किसी फ़ाइल में फ़ाइल नाम में स्थान, टैब आदि नहीं होगा; पहला संस्करण सुरक्षित है, दूसरा नहीं है।
आपकी स्क्रिप्ट -
एक विकल्प के रूप में " " से शुरू होने वाली फ़ाइल का इलाज नहीं करेगी ।
तो आपका कोड इस तरह दिखना चाहिए:
find . -exec cmd -option1 -option2 -- {} +
या
find . -print0 | xargs -0 cmd -option1 -option2 --
पहला संस्करण छोटा और लिखने में आसान है क्योंकि आप 1 को नजरअंदाज कर सकते हैं, लेकिन दूसरा संस्करण अधिक पोर्टेबल और सुरक्षित है, क्योंकि " -exec cmd {} +
" GNU खोज में एक अपेक्षाकृत नया विकल्प है (2005 से, बहुत सारे रनिंग सिस्टम अभी तक नहीं होंगे) और यह हाल ही में छोटी गाड़ी थी । बहुत सारे लोग इस " -exec cmd {} +
" को नहीं जानते हैं , जैसा कि आप अन्य उत्तरों से देख सकते हैं।
exec
आउटपुट परिणाम का उपयोग कर के रूप में वे पाए जाते हैं, जो xargs
होगा, ऐसा लगता है, जब तक पूरी निर्देशिका को लिखने से पहले खोज नहीं की जाती है तब तक प्रतीक्षा करें। यदि आप एक बड़ी निर्देशिका पर यह कोशिश कर रहे हैं, और ऐसा लगता है कि xargs
काम नहीं कर रहा है, तो धैर्य उचित है।
-print0
रिटर्न के साथ अलग किए गए रिटर्न फाइलनाम को खोजा जाता है , लेकिन न्यूलाइन एक फ़ाइल नाम का भी हिस्सा हो सकता है, जो इसे अस्पष्ट बनाता है। बाइट 0 नहीं कर सकते, इसलिए यह एक सुरक्षित विभाजक है। हां - --
एक कमांड को जोड़ना जो इसका समर्थन करता है एक अच्छा अभ्यास है जब आप इसके तर्कों को नियंत्रित नहीं कर सकते हैं, भले ही हमेशा सख्त या असुरक्षित न हो।
find . | xargs cmd
अधिक कुशल है (यह प्रत्येक मैच के लिए एक बार चलने के cmd
विपरीत exec
, जितना संभव हो उतना कम cmd
बार चलता है )। हालाँकि, यदि आप फ़ाइल नाम रिक्त स्थान या कायरता वर्ण रखते हैं तो आप परेशानी में पड़ जाएंगे।
निम्नलिखित का उपयोग करने का सुझाव दिया गया है:
find . -print0 | xargs -0 cmd
इस भले ही फ़ाइल नाम फंकी वर्ण हो काम करेंगे ( -print0
बनाता find
NUL-समाप्त मैचों प्रिंट, -0
बनाता है xargs
इस प्रारूप की उम्मीद है।)
xargs
यदि फ़ाइल (या केवल कुछ) मिलान वाली फ़ाइलों के लिए दृष्टिकोण बहुत धीमा है, और cmd
प्रत्येक फ़ाइल के लिए बहुत कुछ नहीं करना है। उदाहरण के लिए, जब एक खाली निर्देशिका में चलाया जाता है, तो xargs
संस्करण को कम से कम दो बार समय लगेगा, क्योंकि दो प्रक्रियाओं को केवल एक के बजाय शुरू किया जाना चाहिए। (हां, अंतर आमतौर पर * निक्स पर अगोचर है, लेकिन एक लूप में यह महत्वपूर्ण हो सकता है; या, इसे कुछ समय विंडोज पर आज़माएं ...)