2010-11-15 17 views
23

मैं हाल ही में बड़ी संख्या में फाइलों (~ 400,000) की प्रतिलिपि बना रहा हूं और आगे बढ़ रहा हूं। मुझे पता है कि बैश कमांड लाइन पर विस्तारित तर्कों की संख्या पर सीमाएं हैं, इसलिए मैं उत्पादित संख्याओं को सीमित करने के लिए xargs का उपयोग कर रहा हूं।बैश तर्कों की अधिकतम संख्या! = अधिकतम संख्या सीपी तर्क?

जिज्ञासा से बाहर, मैंने सोचा क्या तर्क है कि मैं इस्तेमाल कर सकते हैं की अधिकतम संख्या था, और मैं this post कह रही है कि यह प्रणाली पर निर्भर था, और मैं पता लगाने के लिए इस आदेश को चला सकते हैं कि पाया:

$ getconf ARG_MAX 

मेरे आश्चर्य करने के लिए, anwser मैं वापस मिल गया था:

2621440 

बस से अधिक 26 लाख। जैसा कि मैंने कहा, फाइलों की संख्या जो मैं जोड़ रहा हूं उससे काफी कम है - लगभग 400k। मुझे निश्चित रूप से xargs इन फ़ाइलों को स्थानांतरित करने और कॉपी करने की विधि का उपयोग करने की आवश्यकता है, क्योंकि मैंने सामान्य mv * ... या cp * ... का उपयोग करने का प्रयास किया और 'तर्क सूची बहुत लंबी' त्रुटि प्राप्त की।

तो, mv और cp आदेशों का उपयोग उन तर्कों की संख्या पर अपनी निश्चित सीमा है जो मैं उपयोग कर सकता हूं (मुझे उनके मैन पेजों में कुछ भी नहीं मिला), या क्या मुझे कुछ याद आ रही है?

+0

आपको प्रत्येक फ़ाइल को निर्दिष्ट क्यों करना है? क्या आप केवल उस निर्देशिका को निर्दिष्ट नहीं कर सकते हैं जिसमें वे हैं या ऐसा कुछ? –

+0

@ क्रिस्टोफर मैं सिर्फ एक स्थान से दूसरे स्थान पर एक निर्देशिका की प्रतिलिपि नहीं बना रहा हूं, मैं विशिष्ट फ़ाइलों की प्रतिलिपि बना रहा हूं, फ़ाइलों के बंच का नाम बदल रहा हूं, कुछ फ़ाइलों को एक स्थान से दूसरे स्थान पर ले जा रहा हूं। वास्तव में इन परिचालनों को करने में मुझे कोई समस्या नहीं है। मैं सिर्फ उत्सुक था कि 'सीपी' और' एमवी 'कमांड की विशिष्ट सीमाएं क्या थीं। –

उत्तर

23

रूप इग्नेसियो कहा, ARG_MAXexec() के लिए पारित तर्क की बफर की अधिकतम लंबाई है, नहीं फ़ाइलों की अधिकतम संख्या (this page एक बहुत गहराई से व्याख्या है)। विशेष रूप से, यह निम्न स्थिति की जाँच के रूप में fs/exec.c सूचीबद्ध करता है:

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *)/sizeof(void *) 

और ऐसा लगता है कि आपको कुछ अतिरिक्त सीमाएं हैं:

एक 32-बिट लिनक्स पर, इस ARGMAX है/4-1 (32767)। यह तर्कसंगत हो जाता है यदि तर्कों की औसत लंबाई 4 से कम है लिनक्स 2.6.23 के बाद से, यह फ़ंक्शन परीक्षण करता है यदि MAX_ARG_STRINGS<linux/binfmts.h> (2^32-1 = 4294967296-1) से अधिक है। और अतिरिक्त सीमा के रूप में, एक तर्क MAX_ARG_STRLEN (131072) से अधिक नहीं होना चाहिए।

6

ARG_MAXexec(3) फ़ंक्शंस के तर्कों की अधिकतम लंबाई है। इसकी कमांड लाइन से तर्कों की इस लंबाई को पारित करने के समर्थन के लिए एक खोल की आवश्यकता नहीं है।

+0

लेकिन बैश _any_ सीमा को लागू नहीं करता है, [यह] (http://www.in-ulm.de/~mascheck/various/argmax/) कहता है; यह सिर्फ 'exec' की कोशिश करता है और एक ओएस त्रुटि के साथ गुजरता है यदि तर्क सूची बहुत लंबी है। – alexis

संबंधित मुद्दे