बड़ी संख्या में फ़ाइलों की प्रतिलिपि बनाते समय 'तर्क सूची बहुत लंबी है' त्रुटि


12

मैं निम्नलिखित कमांड का उपयोग कर रहा हूं:

\cp -uf /home/ftpuser1/public_html/ftparea/*.jpg /home/ftpuser2/public_html/ftparea/

और मुझे त्रुटि मिल रही है:

-bash: /bin/cp: Argument list too long

मैंने भी कोशिश की है:

ls /home/ftpuser1/public_html/ftparea/*.jpg | xargs -I {} cp -uf {} /home/ftpuser2/public_html/ftparea/

अभी भी मिला -बश: / बिन / ls: तर्क सूची बहुत लंबी है

कोई विचार?


मैं 1 निर्देशिका से दूसरे तक सभी jpgs को कॉपी करने की कोशिश कर रहा हूं, लेकिन केवल नई फाइलें और जिन्हें अपडेट किया गया है।
icelizard

lsइस तरह की बात करने के लिए डिज़ाइन नहीं किया गया है। का उपयोग करें find
अगली सूचना तक रोक दिया गया।

समस्या एलएस के साथ नहीं है, यह उन तर्कों की संख्या के साथ है जो शेल एलएस से गुजर रहा है। Vi या किसी भी गैर-अंतर्निहित कमांड के साथ आपको वही त्रुटि मिलेगी।
क्रिस

लेकिन lsहै विशेष रूप से ऐसा करने के लिए नहीं बनाया गया: mywiki.wooledge.org/ParsingLs
अगली सूचना तक रोका गया।

यह सच है, लेकिन इस मामले में त्रुटि ls के साथ एक पार्सिंग त्रुटि के कारण नहीं है, यह एक नई प्रक्रिया के लिए एक अरब तर्कों को पारित करने के साथ है जो कि ls होना होता है। एलएस का अनुचित उपयोग होने के अलावा, यह यूनिक्स के संसाधन / डिजाइन सीमा के खिलाफ टक्कर देने के लिए भी होता है। इस मामले में, रोगी को पेट में दर्द और टूटे पैर दोनों हैं।
क्रिस

जवाबों:


19

* .jpg शेल को हैंडल करने की तुलना में लंबी सूची में फैलता है। इसके बजाय यह प्रयास करें

find  /home/ftpuser/public_html/ftparea/ -name "*.jpg" -exec cp -uf "{}" /your/destination \;

मैंने / home / ftpuser1 / public_html / ftparea /name "* jpg" -exec cp -uf "{}" / home / ftpuser2 / public_html / ftparea / का उपयोग किया और निम्न त्रुटि पाई: '-exec' को लापता तर्क
icelizard

आपको cp का अंतिम तर्क याद आ रहा है, जवाब देने वाले ने आपको सही बताया। अपने कार्यान्वयन को दोहराएं। ध्यान दें कि इस उत्तर में "* .jpg" गायब है, इससे दुर्व्यवहार हो सकता है (उदाहरण के लिए "myjpg" नामक dir cp)। ध्यान दें कि यह सम्‍मिलित हो सकता है, लेकिन यह निर्दिष्ट करने के लिए अधिक सुरक्षित है कि आप क्या -कई फ़ाइल का उपयोग करके कॉपी करने जा रहे हैं (
डायर, सिमिलिंक

करीब निरीक्षण के बाद मैं "\" से चूक गया; कमांड को समाप्त करने के लिए -exec को निष्पादित करना चाहिए। मुझे मूर्ख!
icelizard

@AlberT: सिर के लिए धन्यवाद गायब डॉट। वह एक टाइपो था। उत्तर अपडेट किया गया।
शॉन चिन

ऐसा नहीं है कि cp इसे संभाल नहीं सकता है। खोल नहीं सकता।
d -_- b

6

सिस्टम कमांड के लिए तर्क सूची कितनी लंबी हो सकती है, इसकी अधिकतम सीमा है - 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। लेकिन इस जवाब में समझाने के लिए तैयार होने की तुलना में एक कर्नेल को फिर से जोड़ना अधिक काम है।


मुझे इस बात का कोई अंदाजा नहीं है कि यह वोट डाउन क्यों था। यह एकमात्र उत्तर है जो समझा रहा है कि ऐसा क्यों हो रहा है। शायद इसलिए कि आपने xargs को एक अनुकूलन के रूप में उपयोग करने का सुझाव नहीं दिया था?
क्रिस

xargs समाधान में जोड़ा गया है, लेकिन मैं अभी भी चिंतित हूं क्योंकि डाउनवोट्स मेरे विवरण में कुछ गलत तरीके से गलत हैं और कोई भी मुझे यह बताना नहीं चाहता है कि यह क्या है। :(
गोल्डपूडो

xargsअधिक कुशल प्रतीत होता है, परिणामस्वरूप कमांड कॉल की संख्या बहुत कम है। मेरे मामले में, मुझे 6-12 गुना बेहतर प्रदर्शन दिखाई देता है, जब उपयोग करते argsसमय -execबढ़ती फ़ाइलों के साथ समाधान का उपयोग करना दक्षता बढ़ रही है।
जनवरी Vlcinsky

3

ऐसा इसलिए होता है क्योंकि *.jpgविस्तारित होने पर आपकी वाइल्डकार्ड अभिव्यक्ति ( ) कमांड लाइन तर्क लंबाई की सीमा से अधिक हो जाती है (शायद इसलिए कि आपके पास बहुत सारी .jpg फाइलें हैं /home/ftpuser/public_html/ftparea)।

उस सीमा को दरकिनार करने के कई तरीके हैं, जैसे उपयोग करना findया xargs। कैसे करना है के बारे में अधिक जानकारी के लिए इस लेख पर एक नज़र डालें ।


विषय पर अच्छे बाहरी संसाधन के लिए +1।
viam0Zah

3

जैसा कि गोल्डपूडो ने टिप्पणी की थी, आप एक प्रक्रिया में कितने तर्क दे सकते हैं, जिसमें आप स्पॉन कर रहे हैं। उस पैरामीटर के अच्छे विवरण के लिए उसका उत्तर देखें।

आप प्रक्रिया को बहुत अधिक तर्कों को पारित न करके या आपके द्वारा पास किए जा रहे तर्कों की संख्या को कम करके समस्या से बच सकते हैं।

शेल में लूप के लिए, ढूँढें, और ls, grep, और थोड़ी देर के लूप सभी इस स्थिति में एक ही काम करते हैं -

for file in /path/to/directory/*.jpg ; 
do
  rm "$file"
done

तथा

find /path/to/directory/ -name '*.jpg' -exec rm  {} \;

तथा

ls /path/to/directory/ | 
  grep "\.jpg$" | 
  while
    read file
  do
    rm "$file"
  done

सभी में एक प्रोग्राम होता है जो डायरेक्टरी (शेल खुद को, ढूंढना, और एलएस) और एक अलग प्रोग्राम को पढ़ता है जो वास्तव में प्रति निष्पादन में एक तर्क लेता है और कमांड की पूरी सूची के माध्यम से पुनरावृति करता है।

अब, यह धीमा हो जाएगा क्योंकि rm को * .jpg पैटर्न से मेल खाने वाली प्रत्येक फ़ाइल के लिए फोर्क और निष्पादित करना होगा।

यह वह जगह है जहाँ xargs खेलने में आता है। xargs मानक इनपुट लेता है और प्रत्येक N के लिए (फ़्रीबीडीएस के लिए यह डिफ़ॉल्ट रूप से 5000) की तर्ज पर होता है, यह एक प्रोग्राम को इन तर्कों के साथ पढ़ता है। xargs उपरोक्त छोरों का एक अनुकूलन है क्योंकि आपको केवल 1 / N प्रोग्रामों को फोर्क करने की आवश्यकता है जो कि कमांड लाइन से तर्क पढ़ने वाली फाइलों के पूरे सेट पर पुनरावृति करना है।


2

अधिकतम तर्क हैं जो एक कार्यक्रम के लिए निर्दिष्ट किए जा सकते हैं, bash * .jpg से लेकर तर्कों तक ढेर सारे तर्कों का विस्तार करता है। आप इसे find, xargs या rsync आदि के द्वारा हल कर सकते हैं।

Xargs के बारे में यहाँ एक नज़र है और पाते हैं

/programming/143171/how-can-i-use-xargs-to-copy-files-that-have-spaces-and-quotes-in-their-names


1

'*' ग्लोब का विस्तार बहुत सारे फ़ाइलनामों से हो रहा है। इसके बजाय / home / ftpuser / public_html -name '* .jpg' का उपयोग करें।


समान आउटपुट में खोजें और गूँजें * परिणाम - कुंजी यहाँ xargs का उपयोग कर रहा है न कि सभी 1 बिलियन कमांड लाइन तर्क पास करने के लिए शेल के कांटे की कोशिश कर रहा है।
क्रिस

इको * विफल हो जाएगा अगर बहुत सारी फाइलें हैं, लेकिन खोज सफल होगी। इसके अलावा, find -exec का उपयोग करना + xargs का उपयोग करने के बराबर है। (सभी को समर्थन + नहीं मिलता है, हालांकि)
विलियम पर्ससेल 22'09

1

+विकल्प का उपयोग find -execकरने से ऑपरेशन में बहुत तेजी आएगी।

find  /home/ftpuser/public_html/ftparea/ -name "*jpg" -exec cp -uf -t /your/destination "{}" +

+विकल्प की आवश्यकता {}का उपयोग कर तो अंतिम तर्क होने के लिए -t /your/destination(या --target-directory=/your/destination) के लिए विकल्प cpबनाता है यह काम करते हैं।

से man find:

-exec कमांड {} +

          This  variant  of the -exec action runs the specified command on  
          the selected files, but the command line is built  by  appending  
          each  selected file name at the end; the total number of invoca  
          tions of the command will  be  much  less  than  the  number  of  
          matched  files.   The command line is built in much the same way  
          that xargs builds its command lines.  Only one instance of  ‘{}’  
          is  allowed  within the command.  The command is executed in the  
          starting directory.

संपादित करें : पुन: व्यवस्थित तर्क cp के लिए


मुझे यह मिल रहा है: लापता तर्क `-exec '/ home / ftpuser1 / public_html / ftparea /name' * jpg '-exec cp -uf" {} "/ home / ftpuser2 / public_html / ftparea / +
icelizard

मैंने cpउस त्रुटि को ठीक करने के लिए तर्कों को पुन: व्यवस्थित किया ।
अगली सूचना तक रोक दिया गया।

1

ऐसा लगता है कि आपके पास *.jpgउस निर्देशिका में बहुत सारी फाइलें हैं जो उन सभी को एक साथ कमांड लाइन पर डालती हैं। तुम कोशिश कर सकते हो:

find /home/ftpuser/public_html/ftparea1 -name '*.jpg' | xargs -I {} cp -uf {} /home/ftpuser/public_html/ftparea2/

आपके सिस्टम के लिए स्विच सही है man xargsया नहीं यह देखने के लिए आपको अपने कार्यान्वयन की जांच करनी पड़ सकती -Iहै।

वास्तव में, क्या आप वास्तव में उन फाइलों को उसी स्थान पर कॉपी करना चाहते हैं, जहां वे पहले से हैं?


क्षमायाचना ये दो अलग-अलग निर्देशिकाएं हैं ftpuser1 और ftpuser2
icelizard

बस यही कोशिश की: ls /home/ftpuser1/public_html/ftparea/*.jpg | xargs -I {} cp -uf {} / home / ftpuser2 / public_html / ftparea / Still got -bash: / bin / ls: तर्क सूची बहुत लंबी है
icelizard

ओह, तुम काफी सही हो, निश्चित रूप lsसे एक ही समस्या होगी! मैं बदल गया हूँ findजो नहीं होगा।
ग्रेग हेविगेल

0

फोल्डर पर जाएं

cd /home/ftpuser1/public_html/

और निम्नलिखित निष्पादित करें:

cp -R ftparea/ /home/ftpuser2/public_html/

इस तरह यदि फ़ोल्डर 'ftparea' में सबफ़ोल्डर्स हैं, तो यह नकारात्मक प्रभाव हो सकता है यदि आप इसमें से केवल '* .jpg' फ़ाइलें चाहते हैं, लेकिन यदि कोई सबफ़ोल्डर नहीं हैं, तो यह दृष्टिकोण निश्चित रूप से बहुत अधिक तेज़ होगा। खोज और xargs का उपयोग कर

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