सिस्टम कमांड के लिए तर्क सूची कितनी लंबी हो सकती है, इसकी अधिकतम सीमा है - MAX_ARG_PAGES
कर्नेल के संकलित होने के मूल्य के आधार पर यह सीमा डिस्ट्रो-स्पेसिफिक है, और कर्नेल को फिर से देखे बिना इसे बदला नहीं जा सकता है।
ग्लोबिंग जिस तरह से शेल द्वारा नियंत्रित किया जाता है, उसके कारण यह अधिकांश सिस्टम कमांड को प्रभावित करेगा जब आप एक ही तर्क ("* .jpg") का उपयोग करते हैं। चूंकि गोला पहले शेल द्वारा संसाधित होता है, और फिर कमांड को भेजा जाता है, कमांड:
cp -uf *.jpg /targetdir/
अनिवार्य रूप से शेल के समान है जैसा आपने लिखा है:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
यदि आप बहुत सारे jpegs के साथ काम कर रहे हैं, तो यह बहुत जल्दी असहनीय हो सकता है। आपके नामकरण सम्मेलन और आपके द्वारा वास्तव में संसाधित की जाने वाली फ़ाइलों की संख्या के आधार पर, आप एक समय में निर्देशिका के एक अलग सबसेट पर cp कमांड चला सकते हैं :
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
यह काम कर सकता है, लेकिन यह कितना प्रभावी होगा यह इस बात पर आधारित है कि आप अपनी फ़ाइल सूची को सुविधाजनक ग्लोबेबल ब्लॉकों में कितनी अच्छी तरह तोड़ सकते हैं।
Globbable। मुझे वह शब्द पसंद है।
कुछ कमांड, जैसे कि खोज और xargs , बड़ी फ़ाइल सूचियों को बिना दर्द के आकार की तर्क सूचियों को बनाए रख सकते हैं।
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
-Exec तर्क , प्रत्येक फ़ाइल नाम के साथ {} की जगह, प्रत्येक फ़ाइल को ढूंढने के लिए कमांड लाइन के शेष भाग को चलाएगा । चूँकि cp कमांड एक समय में केवल एक फ़ाइल पर चलती है, इसलिए तर्क सूची की सीमा कोई समस्या नहीं है।
प्रत्येक फ़ाइल को व्यक्तिगत रूप से संसाधित करने के कारण यह धीमा हो सकता है। Xargs का उपयोग करना एक अधिक कुशल समाधान प्रदान कर सकता है:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs खोज के द्वारा प्रदान की गई पूरी फ़ाइल सूची ले सकता है , और इसे प्रबंधनीय आकारों की तर्क सूचियों में तोड़ सकता है और उन सभी उपकारों पर cp चला सकता है ।
बेशक, वहाँ भी अपने कर्नेल recompiling की संभावना है, के लिए एक बड़ा मूल्य सेटिंग MAX_ARG_PAGES
। लेकिन इस जवाब में समझाने के लिए तैयार होने की तुलना में एक कर्नेल को फिर से जोड़ना अधिक काम है।