स्थानीय स्तर पर एक बड़ी निर्देशिका पेड़ की नकल? cp या rsync?


230

मुझे एक बड़ी निर्देशिका पेड़ की नकल करनी है, लगभग 1.8 टीबी। यह सब स्थानीय है। आदत से बाहर rsync, लेकिन मुझे आश्चर्य है कि अगर वहाँ बहुत बिंदु है, और अगर मैं बल्कि उपयोग करना चाहिए cp

मैं अनुमतियों और uid / gid के बारे में चिंतित हूं, क्योंकि उन्हें कॉपी में संरक्षित किया जाना है (मुझे पता है कि rsync ऐसा करता है)। साथ ही सहानुभूति जैसी चीजें।

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

कारण मुझे rsync से दूर लुभाया जाएगा, ऐसा इसलिए है क्योंकि rsync मेरी आवश्यकता से अधिक कर सकता है। rsync चेकसम फाइल्स। मुझे इसकी आवश्यकता नहीं है, और मुझे चिंता है कि इसे cp से अधिक समय लग सकता है।

तो आप क्या करते हैं, rsyncया cp?


2
यदि rsync ठीक वही करता है जो आप इसे करना चाहते हैं, यदि आप पहले से ही इस विशेष अनुप्रयोग के लिए इसके उपयोग से काफी परिचित हैं, और यदि यह जल्दी से आपके स्वाद के अनुरूप काम करता है, तो आप धरती पर क्यों स्विच करना चाहेंगे?
ग्यारह81

2
क्योंकि मुझे चिंता है कि rsync cp से अधिक समय लेगा, क्योंकि rsync बहुत सारे चेकसमिंग करता है कि cp नहीं करेगा
Rory

1
डिस्क / नेटवर्क i / o की तुलना में चेकसम का सीपीयू ओवरहेड छोटा है। जब तक डिस्क एक ही सिस्टम पर नहीं होती है और ओएस बस नियंत्रक में कुछ चालाक ड्राइव-ड्राइव कॉपी कर सकता है।
मार्टिन बेकेट

3
चेकसमिंग उन फ़ाइलों पर किया जाता है जो आकार और टाइमस्टैम्प चेक में भिन्न होती हैं। यदि आप पैरानॉयड हैं (जैसे कॉपी के दौरान पावर आउटेज के बाद) तो आप सभी फाइलों पर चेकसमिंग को बाध्य कर सकते हैं, लेकिन स्थानीय स्थानांतरण पर, यह आमतौर पर स्क्रैच से शुरू होने की तुलना में धीमा होता है।
कॉर्कमैन

3
शायद वह अपने वर्कफ़्लो को सुधारने के बारे में उत्सुक है, और रेत में अपना सिर नहीं फोड़ता है यह सोचकर कि वह सब कुछ जानता है। यह टिप्पणी वास्तव में मुझे गुस्सा दिलाती है।
मार्टिन कोनसेनी

जवाबों:


204

मैं rsync का उपयोग करूंगा क्योंकि इसका मतलब है कि अगर यह किसी भी कारण से बाधित है, तो आप इसे बहुत कम लागत के साथ आसानी से पुनः आरंभ कर सकते हैं। और rsync होने के नाते, यह एक बड़ी फ़ाइल के माध्यम से भाग के तरीके को भी पुनरारंभ कर सकता है। जैसा कि दूसरों का उल्लेख है, यह आसानी से फ़ाइलों को बाहर कर सकता है। अधिकांश चीजों को संरक्षित करने का सबसे सरल तरीका -aध्वज का उपयोग करना है - 'संग्रह।' इसलिए:

rsync -a source dest

हालाँकि, यूआईडी / जीआईडी ​​और सीमलिंक संरक्षित हैं -a(देखें -lpgo), आपका प्रश्न यह है कि आप फाइलसिस्टम जानकारी की पूरी कॉपी चाहते हैं; और -aइसमें हार्ड-लिंक, विस्तारित विशेषताएँ या ACL (लिनक्स पर) या उपरोक्त और न ही संसाधन कांटे (OS X पर) शामिल नहीं हैं, इस प्रकार, एक फाइलसिस्टम की एक मजबूत प्रतिलिपि के लिए, आपको उन झंडों को शामिल करना होगा:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

डिफ़ॉल्ट cp फिर से शुरू होगा, हालांकि -uध्वज "केवल तभी कॉपी होगा जब गंतव्य फ़ाइल की तुलना में SOURCE फ़ाइल नई हो या जब गंतव्य फ़ाइल गायब हो" । और -a(संग्रह) ध्वज पुनरावर्ती होगा, पुनरावृत्ति फ़ाइलें नहीं यदि आपको पुनरारंभ करना और अनुमतियाँ संरक्षित करना है। इसलिए:

cp -au source dest

5
Cp का -u झंडा शायद सबसे अच्छा समाधान नहीं है, क्योंकि यह आंशिक रूप से कॉपी / दूषित फ़ाइल का पता नहीं लगाएगा। Rsync के बारे में अच्छी बात यह है कि मतभेदों का पता लगाने के लिए आपके पास यह md5 योग हो सकता है।
चाड हुननेकट जुएल

3
जोड़ने -w (--whole- फ़ाइल) विकल्प एक बाधित rsync को गति देगा, क्योंकि यह चेकसमिंग के बजाय फ़ाइल पर कॉपी करेगा।
हयालसी

13
वास्तव में, rsync स्थानीय स्थानान्तरण का पता लगाता है और स्वचालित रूप से जाँच के बिना पूरी फ़ाइल की प्रतिलिपि बनाता है।
कॉर्कमैन

22
और --प्रक्रिया जो वास्तव में आसान है!
मैट

12
-P या --प्रोग्रेस प्रत्येक फ़ाइल के लिए व्यक्तिगत रूप से प्रगति दिखाता है। यह बड़ी फ़ाइलों की प्रतिलिपि बनाने के लिए उपयोगी है, कई (हजारों) छोटी फ़ाइलों के लिए नहीं है क्योंकि इसका अर्थ है बहुत अधिक आउटपुट जो आप पढ़ नहीं सकते हैं। यह संयुक्त सभी फाइलों की अति प्रगति को नहीं दिखाता है।
SPRBRN

106

स्थानीय फ़ाइल सिस्टम में कॉपी करते समय मैं हमेशा निम्नलिखित rsync विकल्पों का उपयोग करता हूं:

# rsync -avhW --no-compress --progress /src/ /dst/

यहाँ मेरा तर्क है:

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

मैंने निम्नलिखित टार कमांड पर एक अन्य उत्तर के रूप में उपरोक्त rsync सेटिंग्स का उपयोग करके 17% तेजी से स्थानान्तरण देखा है:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

1
मुझे निम्नलिखित त्रुटि हो रही है: rsync: --no-compress: unknown option@ एलीस पर्किवल।
alper

यह तेजी से हल्का हो रहा है। इससे भी तेज rm -rf /src/
डी जी ओ

2
@Alper की तरह, --no-compress मेरे rsync के संस्करण के लिए एक विकल्प नहीं था (CentOS 7 में); मैंने इसके बजाय --compress-level = 0 का उपयोग किया।
पॉल

79

जब मुझे बड़ी मात्रा में डेटा कॉपी करना होता है, तो मैं आमतौर पर टार और rsync के संयोजन का उपयोग करता हूं। पहला पास इसे फाड़ना है, कुछ इस तरह से है:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

आमतौर पर बड़ी मात्रा में फ़ाइलों के साथ, कुछ ऐसे भी होंगे जो टार जो भी कारण से नहीं संभाल सकते हैं। या हो सकता है कि प्रक्रिया बाधित हो जाए, या यदि यह एक फाइलसिस्टम माइग्रेशन है, तो आप वास्तविक माइग्रेशन चरण से पहले प्रारंभिक कॉपी करना चाहते हैं। किसी भी दर पर, प्रारंभिक प्रतिलिपि के बाद, मैं इसे पूरा करने के लिए एक rsync चरण करता हूं:

# cd /dst; rsync -avPHSx --delete /src/ .

ध्यान दें कि अनुगामी स्लैश /src/महत्वपूर्ण है।


6
+1 मैंने पाया है कि आमतौर पर rsync की तुलना में बड़ी प्रतियों के लिए तेज़ होना चाहिए। मुझे अंतिम rsync के साथ परिष्करण का विचार भी पसंद है।
ज्योफ फ्रिट्ज़

2
अगर डे्रस खाली है तो टार एक अच्छा विकल्प है। हालांकि मेरा रास्ता होगा: cd $ DSTDIR; टार c -C $ SRCDIR। | टार
asdmin

19
यही इस विधि की सुंदरता है। आपको स्थान को दोगुना करने की आवश्यकता नहीं है क्योंकि आप वास्तव में कभी भी इंटरमीडिएट टार फाइल नहीं बनाते हैं। पाइप से पहले टार डेटा पैक करता है और इसे स्टडआउट करने के लिए स्ट्रीम करता है, और पाइप के बाद टार इसे स्टड से पकड़ लेता है और इसे अनपैक कर देता है।
चाड हनीयकट

4
मैंने 12gb ट्रांसफर के लिए cp -a किया और 42gb ट्रांसफर के लिए यह तरीका। टार विधि समय के बारे में 1/4 लिया।
NGaida

3
मैंने pvप्रगति को देखने में सक्षम होने के लिए बीच में भी रखा , सभी डेटा के उपयोग का अनुमान लगाते हुए df। मैंने भी उपयोग किया --numeric-owner, क्योंकि स्रोत डिस्क एक अन्य प्रणाली से थी और मैं tarमालिकों को गड़बड़ नहीं करना चाहता था :tar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
पेट्र पुडलक

14

rsync

यहाँ मैं उपयोग rsync है, मैं साधारण कमांड के लिए cp पसंद करता हूँ, यह नहीं।

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

केन्द्रीय लोक सूचना अधिकारी

यहाँ एक तरीका है जो और भी सुरक्षित है, cpio। यह टार के रूप में उपवास के बारे में है, शायद थोड़ा तेज।

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

टार

यह अच्छा भी है, और पढ़ने-विफल होने पर जारी है।

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

ध्यान दें कि सभी स्थानीय प्रतियों के लिए हैं।


आप rsync के लिए -S और -D झंडे का उपयोग क्यों करते हैं?
मियालिस जू

7

आप जो भी पसंद करें। -aजब आप उपयोग करने का निर्णय लेते हैं तो बस स्विच को मत भूलना cp

यदि आपको वास्तव में उत्तर की आवश्यकता है: मैं rsync का उपयोग करूंगा क्योंकि यह बहुत अधिक लचीला है। नकल पूरी होने से पहले बंद करने की जरूरत है? बस ctrl-c और अपनी पीठ के रूप में जल्द ही फिर से शुरू। कुछ फ़ाइलों को बाहर करने की आवश्यकता है? बस उपयोग करें --exclude-from। स्वामित्व या अनुमतियाँ बदलने की आवश्यकता है? rsync आपके लिए ऐसा करेगा।


-P झंडा फिर से क्या करता है?
रोरी

1
यह प्रिस्वर स्वामित्व, टाइमस्टैम्प और अनुमतियाँ होगी।
इन्नाम

5
cp -a बेहतर होगा।
डेविड पशले

वास्तव में। तदनुसार उत्तर बदल गया।
इन्ना

7

rsyncआदेश हमेशा हर बाइट यह स्थानान्तरण पर चेकसम गणना करता है।

कमांड लाइन विकल्प --checksumकेवल इस बात से संबंधित है कि फाइलों के चेकसम का उपयोग यह निर्धारित करने के लिए किया जाता है कि कौन सी फाइल को स्थानांतरित किया जाए या नहीं:

-c, --checksum चेकसम के आधार पर छोड़ें, न कि मॉड-टाइम और आकार "

मैनपेज यह भी कहता है:

ध्यान दें कि rsync हमेशा पुष्टि करता है कि प्रत्येक ट्रांसफ़र की गई फ़ाइल को उसकी पूरी-पूरी फ़ाइल चेकसम को चेक करके सही ढंग से रिस्ट्रिक्ट किया गया था, लेकिन उस ऑटोमैटिक आफ्टर-ट्रांसफर वेरिफिकेशन का इस ऑप्शन के पहले के ट्रांसफर से कोई लेना-देना नहीं है " अद्यतन किया जाएगा?" चेक।

तो rsyncभी, हमेशा, पूरी फ़ाइल की एक चेकसम की गणना प्राप्त पक्ष पर करता है, तब भी जब -c/ --checksumविकल्प "बंद" हो।


14
जबकि आपकी पोस्ट ने कुछ रोचक जानकारी यहाँ जोड़ दी है, और आपके पोस्ट का मूल्य घट जाता है। यह साइट गैर-रचनात्मक किराए के लिए एक मंच नहीं है। यदि आप स्रोत को संशोधित करने में सक्षम थे, तो क्या आपने अपने संशोधनों को एक पैच के रूप में प्रस्तुत किया है? क्या आपने अपने संस्करण को गितुब या कुछ और पर पोस्ट किया है? यदि आप इसके बारे में इतनी दृढ़ता से महसूस करते हैं, तो बेहतर हो सकता है कि यदि आप अनावश्यक रूप से अपमान करने के बजाय कुछ अधिक रचनात्मक करने की कोशिश करें।
Zoredache

हाँ, अंतिम पैराग्राफ वास्तव में आवश्यक नहीं था।
शेरविन फ्लाइट

6

rsync -aPhW --protocol=28RSYNC के साथ उन बड़ी प्रतियों को गति देने में मदद करता है। मैं हमेशा rsync जाता हूं क्योंकि 90GiB के माध्यम से मध्य होने का विचार और यह मुझे सीपी से दूर करता है


2
उस कमांड स्ट्रिंग में पुराने प्रोटोकॉल का उपयोग करने का मूल्य क्या है?
इविविट

1
एक मैक मशीन पर रुसक शिप का पुराना संस्करण कुछ नए rsync प्रोटोकॉल पर लटका हुआ है, जैसे कि 29। पुराने प्रोटोकॉल में जाने के लिए कहने पर यह बार-बार चेक नहीं करता है।
वनगुनीक

मुझे लगता है कि संख्या 28 अब मान्य नहीं है?
SPRBRN

5

rsync बहुत अच्छा है, लेकिन वास्तव में बड़ी निर्देशिका पेड़ों के साथ समस्या है क्योंकि यह पेड़ों को स्मृति में संग्रहीत करता है। मैं सिर्फ यह देखना चाह रहा था कि क्या मुझे यह समस्या ठीक होगी जब मुझे यह धागा मिल जाएगा।

मैंने भी पाया:

http://matthew.mceachen.us/geek/gigasync/

आप मैन्युअल रूप से पेड़ को तोड़ सकते हैं और कई rsyncs चला सकते हैं।


12
यदि आप संस्करण 3 का उपयोग करते हैं, तो यह पूरे पेड़ को स्मृति में नहीं रखता है यदि यह बड़ा है, तो यह एक वृद्धिशील-पुनरावृत्ति एल्गोरिथ्म का उपयोग करता है: samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandh

5

यह धागा बहुत उपयोगी था और क्योंकि परिणाम प्राप्त करने के लिए बहुत सारे विकल्प थे, इसलिए मैंने उनमें से कुछ को बेंचमार्क करने का फैसला किया। मेरा मानना ​​है कि मेरे परिणाम दूसरों के लिए मददगार हो सकते हैं, जो तेजी से काम करते हैं।

ले जाने के लिए 532Gb के बीच वितरित डेटा के 1,753,200 फ़ाइलें हम उस समय के लिए किया था:

  • rsync 232 मिनट लगे
  • tar 206 मिनट लगे
  • cpio 225 मिनट लगे
  • rsync + parallel 209 मिनट लगे

मेरे मामले में मैंने उपयोग करना पसंद किया rsync + parallel। मुझे उम्मीद है कि यह जानकारी अधिक लोगों को इन विकल्पों के बीच निर्णय लेने में मदद करती है।

पूरा बेंचमार्क यहां प्रकाशित किया गया है


404 पृष्ठ नहीं मिला
एमी वैन गैसे

1
धन्यवाद @AmedeeVanGasse URL आपके द्वारा रिपोर्ट किए जाने के कुछ समय बाद तय किया गया है :)
arjones

बेंचमार्किंग क्यों नहीं cp? यह सवाल का शीर्षक है!
calandoa

@calandoa मुझे लगता cpहै कि असुरक्षित है, यानी: जब यह टूट जाता है तो आपको शुरू करना पड़ता है, इस तरह से मैं उन विकल्पों का पक्ष rsync
लेता

3

स्थानीय निर्देशिका की प्रतिलिपि बनाते समय, मेरा अनुभव यह है कि "cp -van src dest" rsync से 20% अधिक तेज़ है। जहाँ तक रीस्टेबिलिटी की बात है, वही "-n" करता है। आपको बस आंशिक रूप से कॉपी की गई फ़ाइल को rm करने की आवश्यकता है। दर्दनाक नहीं है जब तक कि यह एक आईएसओ या कुछ ऐसा नहीं है।


2

ARJ बहुत बड़ा स्कूल है !! मुझे वास्तव में संदेह है कि ARJ और / या rsync प्रदर्शन देंगे।

निश्चित रूप से मैं हमेशा क्या करता है cpio का उपयोग करें:

find . -print | cpio -pdm /target/folder

यह सीपी की तुलना में लगभग तेज है, निश्चित रूप से टार की तुलना में तेज और बिना कुछ भी पाइपिंग के।


2
"मूल cpio और यूटिलिटीज एटी एंड टी के यूनिक्स सपोर्ट ग्रुप में काम करते समय डिक हैट द्वारा लिखे गए थे। वे पहली बार 1977 में PWB / UNIX 1.0 में दिखाई दिए थे" - FreeBSD का cpioमैन पेज।
क्रिस एस।

3
cpioदुर्भाग्य से फ़ाइलों के लिए एक 8GB ऊपरी सीमा है।

" कुछ भी पाइपिंग के बिना " [sic]। findकमांड को छोड़कर , जैसा कि आपने इसे सूचीबद्ध किया है, इसमें एक पाइप है:find . -print | cpio -pdm /target/folder
वॉरेन

1

आप निश्चित रूप से एक कोशिश rclone देना चाहते हैं । यह बात तेजी से पागल है:

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

यह एक स्थानीय कॉपी और LITEONIT LCS-256 (256GB) SSD से है।

आप --ignore-checksumइसे और भी तेज करने के लिए पहले रन में जोड़ सकते हैं ।



0

tar नौकरी भी करेगा, लेकिन rsync की तरह बाधित होने से फिर से शुरू नहीं करेगा।


एक पुराना उत्तर, लेकिन फ़ाइलों के संपीड़ित अभिलेखागार बनाने के लिए TAR नहीं है? Rsync या cp जैसी फ़ाइलों को स्थानांतरित करने के लिए इसका उपयोग कैसे किया जा सकता है?
शेरविन फ्लाइट

@SherwinFlight सीडी स्रोत; टार cf -। | (सीडी डेस्ट; टार xf -)
पीजी

0

यदि आप ARJ का उपयोग करते हैं तो क्या होगा?

arj a -jm -m1 -r -je filepack /source

जहां -jm -m1संपीड़न स्तर हैं और -jeयह एक निष्पादन योग्य बनाता है। अब आपके पास फाइलों का एक एनकैप्सुलेटेड बैश है।

फिर लक्ष्य के नक्शे में निष्कर्षण के लिए

filepack -y  

जहां स्रोत का नक्शा बनाया जाएगा (जहां -yहमेशा स्वीकार करें, अधिलेखित करें, छोड़ें आदि)

इसके बाद फाइलपैक को टारगेट एरिया में फेक कर सकते हैं और यदि संभव हो तो इसे निष्पादित कर सकते हैं।


1
Arj? क्या 80 के दशक में मृत्यु नहीं हुई थी?
माइकल हैम्पटन

शायद 90 के दशक की शुरुआत में अगर आप विकिपीडिया को मानते हैं
मैट

0

कुछ स्पीड-अप हैं जिन्हें निम्न पर लागू किया जा सकता है rsync:

से बचें

  • -z/ --compress: संपीड़न केवल CPU को लोड करेगा क्योंकि हस्तांतरण एक नेटवर्क पर नहीं बल्कि RAM पर है।
  • --append-verify: एक बाधित स्थानांतरण फिर से शुरू करें। यह एक अच्छा विचार लगता है, लेकिन इसमें खतरनाक विफलता का मामला है: कोई भी गंतव्य स्रोत के समान आकार (या अधिक) फ़ाइल को IGNORED किया जाएगा। इसके अलावा, यह अंत में पूरी फ़ाइल को चेक करता है, जिसका अर्थ है --no-whole-fileकि एक खतरनाक विफलता मामले को जोड़ते समय कोई महत्वपूर्ण गति नहीं है ।

उपयोग

  • -S/ --sparse: विरल ब्लॉकों में नल के अनुक्रमों को चालू करें
  • --partialया -Pजो है --partial --progress: भविष्य में फिर से शुरू करने के लिए आंशिक रूप से स्थानांतरित फ़ाइलों को सहेजें। नोट: फ़ाइलों में एक अस्थायी नाम नहीं होगा, इसलिए यह सुनिश्चित करें कि पूरी कॉपी के पूरा होने तक और कुछ भी गंतव्य का उपयोग करने की उम्मीद नहीं है।
  • --no-whole-fileइतना है कि कुछ भी है कि नाराज होने की जरूरत है डेल्टा हस्तांतरण का उपयोग करता है। आंशिक रूप से हस्तांतरित फ़ाइल का आधा पढ़ना अक्सर इसे फिर से लिखने की तुलना में बहुत तेज होता है।
  • --inplace फ़ाइल की प्रतिलिपि से बचने के लिए (लेकिन केवल तब तक जब गंतव्य पूरा न होने तक कुछ भी नहीं पढ़ रहा हो)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.