लिनक्स में एक लाख छवियों को एक निर्देशिका से दूसरी में स्थानांतरित करने का सबसे तेज़ तरीका क्या है?


14

मेरे पास एक मिलियन छवियां हैं जो 30GB डिस्क स्थान लेती हैं जिन्हें एक स्थानीय निर्देशिका से दूसरे स्थानीय निर्देशिका में स्थानांतरित करने की आवश्यकता होती है।

ऐसा करने का सबसे कुशल तरीका क्या होगा? का उपयोग कर mv? का उपयोग कर cp? का उपयोग कर rsync? कुछ और?

मुझे ये लेने की जरूरत है:

/path/to/old-img-dir/*
                     00000000.jpg
                     --------.jpg  ## nearly 1M of them! ##
                     ZZZZZZZZ.jpg

और उन्हें यहाँ ले जाएँ:

/path/to/new/img/dir/

5
मुझे नहीं लगता कि आप हरा सकते हैं mv, प्रदर्शन-वार, यदि स्रोत और लक्ष्य निर्देशिका दोनों एक ही फाइल सिस्टम में रहते हैं।
फ्रैडरिक हमीदी

जवाबों:


26

rsync यह एक गरीब विकल्प होगा क्योंकि यह बहुत सारे क्लाइंट / सर्वर पृष्ठभूमि का काम करता है जो स्थानीय के साथ-साथ दूरस्थ प्रणालियों के लिए भी खाता है।

mvशायद सबसे अच्छा विकल्प है। यदि संभव हो, तो आपको इसके mv directory_old directory_newबजाय प्रयास करना चाहिए mv directory_old/* directory_new/। इस तरह, आप एक चीज को एक लाख चीजों के बजाय स्थानांतरित करते हैं।


6
फ़ाइलों के बजाय निर्देशिकाओं को स्थानांतरित करने की सलाह के लिए +1।
Ex Umbris

4
साथ ही, mvअगर हम लाखों लोगों के बारे में बात कर रहे हैं , तो वाइल्डकार्ड विस्तार संभवत: समर्थित अधिकतम तर्कों को तोड़ देगा ।
स्लैक

6
rsync स्थानीय भंडारण मीडिया पर स्थानांतरण को ठीक तरह से संभालता है। यह --whole- फाइल (डेल्टा xfer एल्गोरिथ्म के कार्यान्वयन को हटाने) जैसी चीजों को मजबूर करता है और अन्य चीजों को रोकता है जैसे --compression जो स्थानीय स्थानान्तरण में कोई उद्देश्य नहीं रखते हैं। यदि निर्देशिकाएँ विभिन्न फाइल सिस्टम पर रहती हैं, तो 'mv' किसी भी तरह का प्रदर्शन प्रदान नहीं करेगा। यदि वे एक ही फाइल सिस्टम पर रहते हैं, तो इन लोगों की तरह निर्देशिकाओं को केवल 'mv' करें।
यूटाजार्हेड

यदि कई चित्र हैं, तो एक साधारण शेल वाइल्डकार्ड का उपयोग करने से अधिकतम कमांड लाइन ओवरफ्लो हो जाएगी।
राउल सालिनास-मोंटियागुडो

1
डिस्क के बीच घूमना अभी भी सभी डेटा को स्थानांतरित करेगा। एक ही डिस्क पर, mvसिर्फ inode जानकारी तो अद्यतन करता है mv directory_old directory_newकी तुलना में तेजी से काम करता हैmv directory_old/* directory_new
अंशुल

14
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
  • यह तर्क विस्तार को अतिप्रवाह नहीं करेगा।
  • यदि आप चाहें, तो आप फ़ाइल एक्सटेंशन निर्दिष्ट कर सकते हैं। (-नाम ...)
  • find -print0साथ xargs -0आप नामों में रिक्तियां उपयोग करने के लिए अनुमति देता है।
  • xargs -rmvतब तक नहीं चलेगा जब तक कि कुछ स्थानांतरित नहीं किया जाएगा। ( mvयदि कोई स्रोत फ़ाइलें नहीं दी गई हैं तो शिकायत करेंगे)।
  • वाक्यविन्यास mv -tआपको पहले गंतव्य और फिर स्रोत फ़ाइलों को निर्दिष्ट करने की अनुमति देता है, जिनकी आवश्यकता है xargs
  • पूरी निर्देशिका को स्थानांतरित करना बहुत तेजी से होता है, क्योंकि इसमें निहित फ़ाइलों की संख्या की परवाह किए बिना यह निरंतर समय में होता है, लेकिन:
    • स्रोत निर्देशिका समय के एक अंश के लिए गायब हो जाएगी और यह आपको समस्याएं पैदा कर सकती है;
    • यदि प्रक्रिया वर्तमान निर्देशिका को आउटपुट निर्देशिका के रूप में उपयोग कर रही है (हमेशा एक नॉन-मूविंग लोकेशन से पूर्ण पथ के विपरीत), तो आपको इसे पुनः लोड करना होगा। (जैसे आप लॉग रोटेशन के साथ करते हैं )।

वैसे, मैं खुद से पूछूंगा कि क्या मुझे वास्तव में इतनी बड़ी मात्रा में फ़ाइलों को एक साथ स्थानांतरित करना है। बैच प्रोसेसिंग ओवररेटेड है। मैं कोशिश करता हूं कि अगर वे उत्पन्न होते हैं तो मैं बड़ी मात्रा में काम नहीं कर सकता।


यह एक ही सर्वर पर filesystems में फ़ाइलों को स्थानांतरित करने के लिए काफी अच्छी तरह से काम करता है। अच्छी तरह से पर्याप्त है कि मैं rsync में समाधान की तलाश में परेशान नहीं हुआ। निश्चित रूप से एक या दो घंटे लगते हैं, लेकिन यह काम करता है। एक बात ध्यान दें, यदि आप "के बजाय एक निर्देशिका नाम देते हैं।" - खोज कमांड में पीछे चल रहे स्लैश का उपयोग करना सुनिश्चित करें, अन्यथा निर्देशिका को एमवी कमांड के गंतव्य में फिर से बनाया जाएगा।
२०:०२ पर स्पीड mon

7

यदि दो निर्देशिकाएं एक ही फाइल सिस्टम पर रहती हैं, mvतो DIRECTORY पर उपयोग करें न कि निर्देशिका की सामग्री पर।

यदि वे दो अलग-अलग फाइल सिस्टम पर रहते हैं, तो rsync का उपयोग करें:

rsync -av /source/directory/ /destination

/स्रोत पर अनुगामी सूचना दें । इसका मतलब यह है कि यह निर्देशिका के घटकों की नकल करेगा न कि खुद निर्देशिका की। यदि आप /बंद छोड़ देते हैं, तो यह अभी भी फ़ाइलों की नकल करेगा लेकिन वे नाम की एक निर्देशिका में बैठेंगे /destination/directory। / के साथ, फ़ाइलें बस में होंगी/destination

rsyncयदि आप इसे रूट के रूप में चलाते हैं या यदि फ़ाइलें आपके पास हैं, तो फ़ाइल स्वामित्व बनाए रखेंगे। यह mtimeप्रत्येक व्यक्तिगत फ़ाइल का रखरखाव भी करेगा ।


2
एक हार्ड ड्राइव से एक बड़े फ़ोल्डर को एक अलग हार्ड ड्राइव पर कॉपी करने के लिए, rsyncचारों ओर हलकों को चलाने के लिए लगता है mv। पारितोषिक के लिए धन्यवाद!
leo-the-manic

2
tar cf - dir1 | (cd dir2; tar xf -)

tar cf - dir1 | ssh remote_host "( cd /path/to/dir2; tar xf - )"

जब आप 'cp' का उपयोग करते हैं, तो प्रत्येक फ़ाइल एक ओपन-रीड-क्लोज़-ओपन-राइट-क्लोज़ करती है। टार एक साथ कई फाइलों पर काम करने के लिए पढ़ने और लिखने के साथ-साथ कई treads की विभिन्न प्रक्रियाओं का उपयोग करता है। यहां तक ​​कि एक ही सीपीयू बॉक्स पर मल्टीथ्रेड एप्स तेज होते हैं।


2
हालांकि यह प्रश्न का उत्तर दे सकता है, यह एक बेहतर उत्तर होगा यदि आप कुछ स्पष्टीकरण प्रदान कर सकते हैं कि ऐसा क्यों होता है।
DavidPostill

1
यदि वे स्थानीय मशीन में हैं, तो संभावना है कि वे एक ही फाइल सिस्टम में रहते हैं। उपयोग करने से tar c | tar xआपको O (file_count) के बजाय O (Total_size) की लागत मिलती है।
राउल सालिनास-मोंटियागुडो

1

जैसा कि Directory_old और Directory_new दोनों एक ही फाइल सिस्टम पर हैं आप विकल्प cp -lके mvरूप में उपयोग कर सकते हैं । cp -lमूल फ़ाइलों के लिए एक कठिन लिंक बनाएगा। जब आप 'मूव' के साथ हो जाते हैं और आप परिणाम से संतुष्ट हो जाते हैं तब आप इन फाइलों को directory_old से हटा सकते हैं। गति के संदर्भ में यह 'mv' के समान होगा क्योंकि आप पहले लिंक बनाते हैं और फिर आप मूल को हटा देते हैं। लेकिन यह दृष्टिकोण आपको शुरुआत से शुरू करने देता है अगर यह समझ में आता है


0

यह निर्भर करता है (tm)। यदि आपका फाइल सिस्टम कॉपी-ऑन-राइट है, तो कॉपी ( cpया rsync, उदाहरण के लिए) एक चाल के लिए तुलनीय होना चाहिए। लेकिन अधिकांश सामान्य मामलों के लिए, चाल ( mv) सबसे तेज़ होगी, क्योंकि यह बस डेटा के टुकड़ों के चारों ओर स्विच कर सकता है जो वर्णन करता है कि एक फ़ाइल कहाँ रखी गई है (ध्यान दें: यह अत्यधिक सरल है)।

तो, आपके औसत लिनक्स इंस्टॉलेशन पर, मैं जाऊंगा mv

EDIT: @ Frédéric Hamidi की टिप्पणियों में एक अच्छा बिंदु है: यह केवल तभी मान्य है जब वे दोनों एक ही फाइल सिस्टम और डिस्क पर हों। अन्यथा डेटा वैसे भी कॉपी किया जाएगा।


0

कम से कम ~ 10k फ़ाइलों (कोई निर्देशिका) की प्रतिलिपि बनाने के लिए, cp ने शिकायत की:

निष्पादित करने में असमर्थ / बिन / सीपी: तर्क सूची बहुत लंबी है

सबसे अच्छा विकल्प रुपी है:

rsync स्रोत लक्ष्य

और यह बहुत जल्दी किया गया था!


0

यदि आपके पास खाली स्थान है, तो उन्हें एक .tar फ़ाइल में संग्रहित करें (कोई संपीड़न तेज नहीं है) और फिर उस फ़ाइल को स्थानांतरित करें और इसे अनारक्षित करें।


0

गंतव्य की प्रकृति इस कार्य को करने के लिए सबसे कुशल तरीका निर्धारित करेगी। चलो मान लेते हैं तो आप एक स्थानीय सिस्टम पर कर रहे हैं, अपने PWDहै /अभी। और /aलाखों चित्र शामिल हैं। हमारा काम /bसभी उप-निर्देशिका संरचना को बनाए रखते हुए सभी छवियों को स्थानांतरित करना है । चलो मान भी लेते हैं /aऔर /bदो अलग-अलग विभाजनों के लिए माउंट पॉइंट होते हैं, प्रत्येक स्थानीय रूप से कनेक्टेड डिस्क पर। हम इस कार्य को एक टारपीप के साथ करना चाहते हैं। इसमें कुछ समय लग सकता है, इसलिए सुनिश्चित करें कि आप उपयोग कर रहे हैं screen, tmuxया आप एक पृष्ठभूमि प्रक्रिया के रूप में इस पर अमल।

tar -C /a -cf . | tar -C /b -xf -

यही कारण है कि में सभी फ़ाइलों और निर्देशिकाओं की नक़ल की /aकरने के लिए /bहै, इसलिए अब आप को साफ करने की आवश्यकता होगी /aएक बार आप इस बात की पुष्टि यह त्रुटि के बिना पूरा किया।

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