मैं scp के ऊपर बड़ी संख्या में छोटी फ़ाइलों को कैसे कॉपी कर सकता हूं?


59

मेरे पास एक निर्देशिका है जो कई गीगाबाइट और कई हजार छोटी फाइलें मिली है। मैं इसे एक से अधिक बार scp वाले नेटवर्क पर कॉपी करना चाहता हूं। स्रोत और गंतव्य मशीनों पर सीपीयू समय सस्ता है, लेकिन प्रत्येक फ़ाइल को व्यक्तिगत रूप से कॉपी करके जोड़ा गया नेटवर्क ओवरहेड बहुत बड़ा है। मैं इसे टार्ज़ / गेज़िप करूंगा और इसे ऊपर शिप कर दूंगा, लेकिन डिस्क पर स्रोत मशीन कम है।

क्या मेरे tar -czf <output> <directory>पास scp के आउटपुट को पाइप करने का कोई तरीका है ? यदि नहीं, तो क्या एक और आसान उपाय है? मेरी स्रोत मशीन प्राचीन (SunOS) है, इसलिए मैं इस पर चीजें स्थापित नहीं करूंगा।

जवाबों:


104

आप एक ssh सत्र में टार पाइप कर सकते हैं:

$ tar czf - <files> | ssh user@host "cd /wherever && tar xvzf -"

3
+1 टार-पाइप समाधान। यदि आपके पास अधिक बैंडविड्थ और कम सीपीयू है तो आप कम्प्रेशन फ़्लैग को हटा सकते हैं (हालाँकि gzip बहुत हल्का है)।
आहारबुद्ध

2
और अगर आप संपीड़न झंडा ड्रॉप और इसके बजाय SSH में इसे सक्रिय (कर सकता है ssh -Cया Compression yesमें ~/.ssh/config)।
सैम होसेवर

3
इस तरह से टार का उपयोग करने के बारे में कभी नहीं सोचा था। खैर, मैं यहाँ क्यों आता हूँ!
मिस्टर शकाडांस २३'११

2
इस आदेश को थोड़ा कम किया जा सकता है:$ tar cz <files> | ssh user@host "cd /wherever; tar xvz"
कारलिटो

2
@GGGG, POSIX संगत सॉफ्टवेयर का एक सम्मेलन है जिसका अर्थ है STDIN या STDOUT संदर्भ के आधार पर। पहला डैश का अर्थ है from / देव / स्टडिन से पढ़ा गया ’और दूसरा - जो वास्तव में रिमोट होस्ट पर निष्पादित होता है - जिसका अर्थ है din / देव / स्टडिन’। पाइप और ssh इन दोनों प्रक्रियाओं को जोड़ते हैं। अधिक जानने के लिए unix.stackexchange.com/questions/16357/… देखें ।
रिचर्ड मेट्ज़लर

22

Bzip2 संपीड़न के साथ टार को नेटवर्क से और सीपीयू पर अधिक भार लेना चाहिए।

$ tar -C /path/to/src/dir -jcf - ./ | ssh user@server 'tar -C /path/to/dest/dir -jxf -'

उपयोग नहीं होने के -vकारण स्क्रीन आउटपुट प्रक्रिया को धीमा कर सकता है। लेकिन अगर आप चाहते हैं कि एक वर्बोज़ आउटपुट इसे टार के स्थानीय पक्ष पर उपयोग करें ( -jcvf), तो दूरस्थ भाग पर नहीं।

यदि आप बार-बार एक ही गंतव्य पथ पर कॉपी करते हैं, जैसे बैकअप कॉपी अपडेट करना, तो आपका सबसे अच्छा विकल्प संपीड़न के साथ rsync है।

$ rsync -az -e ssh /path/to/src/dir/ user@server:/path/to/dest/dir/

ध्यान दें कि src और dest दोनों रास्ते a / से समाप्त होते हैं। फिर से, उपयोग नहीं करने -vऔर -Pउद्देश्य पर झंडे, उन्हें जोड़ने अगर आप क्रिया उत्पादन की जरूरत है।


16

उपयोग rsync, यह SSH का उपयोग करता है।

उपयोग:

rsync -aPz /source/path destination.server:remote/path

Rsync स्विच संपीड़न और I-Node जानकारी की देखभाल करता है। -Pहर फ़ाइल की प्रगति प्रदर्शित करता है।

आप उपयोग कर सकते हैं scp -C, जो संपीड़न को सक्षम करता है, लेकिन यदि संभव हो तो उपयोग करें rsync


दुर्भाग्य से, स्रोत मशीन पर rsync उपलब्ध नहीं है, और न ही sshd है।
nmichaels

1
sshd क्लाइंट मशीन पर उन कार्यों के लिए आवश्यक नहीं है।
पोलमोन

3

आप tarssh का उपयोग करके दोनों सिरों पर चला सकते हैं । अच्छाई scpके sshपरिवार का हिस्सा है , तो आप शायद यह दोनों सिरों पर है।

 8:03AM 12 % tar cf - some_directory | ssh dest_host "tar xf -"

नेटवर्क ट्रैफ़िक को कम करने के लिए पाइप लाइन में gzip या bzip2 काम करने का एक तरीका भी हो सकता है।


3

@ पोदो का उत्तर अच्छा है, लेकिन एक बफर और अच्छे संपीड़न के साथ गति बढ़ा सकता है और एक प्रगति पट्टी जोड़ सकता है।

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

इसके अतिरिक्त, एक आमतौर पर एक उचित संपीड़न एल्गोरिथ्म के साथ गति बढ़ा सकता है। Gzip (जैसे ऊपर उपयोग किया गया) एक तेज संपीड़न एल्गोरिथ्म है, लेकिन सामान्य रूप से zstandard ( zstd) और (उच्च संपीड़न अनुपात LZMA / LZMA2 के लिए xz) बेहतर संपीड़ित करेगा और उसी समय तेज हो जाएगा। नया xz और zstd मल्टी कोर समर्थन पहले से ही बनाया गया है। । कई कोर पिग के साथ गज़िप का उपयोग करने के लिए इस्तेमाल किया जा सकता है।

एक नेटवर्क पर एक प्रगति बार, बफरिंग और zstandard संपीड़न के साथ डेटा भेजने के लिए एक उदाहरण है:

tar cf - . | pv -perabs $(du -sk . | cut -f 1)K | zstd -14 --long=31 -T0 | pv -qCB 512M | ssh user@host "cd /wherever && pv -qCB 512M | zstd -cd -T0 --long=31 | tar xf -"

पहली pvप्रगति ( पी ), अनुमानित समय ( ), स्थानांतरण दर ( आर ), औसत दर ( ), कुल स्थानांतरित बाइट्स ( बी ) को दिखाना है । कुल आकार के साथ होने का अनुमान है duऔर आकार विकल्प (करने के लिए जोड़ा रों )। प्रगति को संपीड़न और बफरिंग से पहले मापा जाता है, इसलिए यह बहुत सटीक नहीं है, लेकिन फिर भी सहायक है।

zstdसंपीड़न सेटिंग 14 के साथ प्रयोग किया जाता है । नेटवर्क के आधार पर इस संख्या को कम या बढ़ाया जा सकता है और CPU की गति इसलिए zstd नेटवर्क की गति से थोड़ी तेज होती है। हैसवेल 3.2 GHz CPU 14 पर चार कोर के साथ लगभग 120 MB / s की गति देता है। उदाहरण में, लंबी मोड 31 (2 जीबी विंडो का उपयोग करता है, बहुत अधिक रैम की आवश्यकता होती है, लेकिन डेटाबेस डंप को संकुचित करने के लिए बहुत अच्छा उदा।) का उपयोग किया जाता है। T0 विकल्पों कोर की संख्या के धागे की राशि निर्धारित करता है। एक को पता होना चाहिए कि लंबी मोड के साथ ये सेटिंग्स बहुत मेमोरी का उपयोग करती हैं।

Zstd के साथ एक समस्या यह है कि अधिकांश ऑपरेटिंग सिस्टम संस्करण> = 1.3.4 के साथ शिप नहीं होते हैं। यह संस्करण उचित मल्टी कोर और लंबे समर्थन के लिए आवश्यक है। यदि उपलब्ध नहीं है, तो इसे बस के साथ https://github.com/facebook/zstd से संकलित और स्थापित किया जा सकता है make -j4 && sudo make install। Zstd के बजाय, कोई भी xz या pigz का उपयोग कर सकता है। Xz धीमा है, लेकिन बहुत अच्छी तरह से (धीमी गति से कनेक्शन पर अच्छा) संपीड़ित करता है, pigz / gzip तेज़ है लेकिन इतनी अच्छी तरह से संपीड़ित नहीं करता है। pvतब फिर से उपयोग किया जाता है, लेकिन बफरिंग के लिए ( qचुप रहने के Cलिए, बिना किसी ब्याह मोड के लिए [हमेशा बफरिंग के लिए आवश्यक है] और Bबफर सेट करने के लिए)।

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


2

यदि आपके पास दोनों सिरों पर gzip है: sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh user@destinationhost "cd destinationdir && gzip -c -d | tar xf -"

यदि आपके पास स्रोत मशीन पर gzip नहीं है, तो सुनिश्चित करें कि आपने गंतव्य पर अनकंफर्टेबल है: sourcehost$ cd sourcedir && tar cf - . | compress | ssh user@destinationhost "cd destdir && uncompress | tar xf -"

यह पहले इसे तेज़ करने, फिर भेजने, फिर अनज़िप करने से अधिक तेज़ होगा, और इसके लिए किसी भी अतिरिक्त डिस्क स्थान की आवश्यकता नहीं है। मैंने टार पर कंप्रेशन (z) के झंडे को छीन लिया, क्योंकि शायद आपके पास प्राचीन काल में ऐसा नहीं है।


2

या यदि आप की जरूरत है तो आप इसे दूसरे तरीके से कर सकते हैं। यह नेटवर्क पर टारबॉल खींच रहा है जैसे कि यह सुझाव दिया गया है जैसे धक्का। यह आपके प्रश्न के दोहराए गए भाग को हल नहीं करता है और rsync इसके लिए सबसे अच्छा है लेकिन मदद करने के लिए शायद टार स्विच है।

तो स्थानीय मशीन पर:

ssh remote 'tar zcf - /etc/resolv.conf' | tar zxf -

सबसे पहले सही निर्देशिका में होना चाहिए या आपको अंत में अनरेटिंग कमांड पर -सी स्विच का उपयोग करना होगा।

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

HTH


1

या sshfs के माध्यम से दूरस्थ फाइल सिस्टम को माउंट करें

sshfs user@remotehost:/path/on/remote /path/on/local

1

सबसे सुरुचिपूर्ण नहीं है, खासकर जब से यह एक जिप या टार फाइल की नकल नहीं कर रहा है और दोगुना है, इसलिए यह नेटवर्क ovehead को कम करने में मदद नहीं करता है, मेरी एकमात्र पसंद का उपयोग करना था scp -r:

-r

      पूरी निर्देशिका को पुन: कॉपी करें। ध्यान दें कि scp ट्री ट्रैवर्सल में अंकित प्रतीकात्मक लिंक निम्नानुसार हैं।
स्रोत: scp (1)

मैं 30 जीबी ज़िप्ड टार फाइल के साथ डिस्क स्थान से बाहर निकलने के मुद्दों में चल रहा था। मुझे लगा कि गनज़िप इसे इनलाइन कर सकता है, अर्थात, मूल को हटा रहा है क्योंकि यह अनज़िप किया जा रहा था (और हो सकता है कि मैं Google परिणाम से चूक गया हो) लेकिन मुझे कुछ भी नहीं मिला।

अंत में, क्योंकि मैं कई बार एक नए TAR या ZIP फ़ाइल के समाप्त होने की प्रतीक्षा करते-करते थक गया था या टारिंग कर रहा था या मैं केवल इसे देख रहा था:

  1. मूल सर्वर / पीसी / लैपटॉप से, उस निर्देशिका में नेविगेट करें जहां आपका फ़ोल्डर कई फ़ाइलों / फ़ोल्डरों के साथ है।
  2. scp -r source_folder_name yourname@yourservername:destination_folder_name

फिर बस कुछ बीयर, कॉफी या पॉपकॉर्न पकड़ो और प्रतीक्षा करें। अच्छी बात यह है कि अगर नेटवर्क कनेक्शन "स्टाल" होगा तो scp पुनः प्रयास करेगा। बस आशा है कि यह पूरी तरह से नीचे नहीं जाता है।


ठीक है, यह स्पष्ट रूप से एक हजार scpकमांड टाइप करने की तुलना में आपका समय कम लेता है । लेकिन सवाल "नेटवर्क ओवरहेड" के बारे में पूछता है। क्या आपका समाधान प्रत्येक फ़ाइल को व्यक्तिगत रूप से कॉपी करने से कम किसी नेटवर्क का उपयोग करता है? क्या आपका समाधान किसी भी तरह से उन सात से बेहतर है जो पहले ही पोस्ट किए जा चुके हैं?
जी-मैन

स्नैप, मेरा बुरा - मैं पूरी तरह से नेटवर्क ओवरहेड भाग से चूक गया - उस @ जी-मैन को इंगित करने के लिए धन्यवाद। मैंने उत्तर को अपडेट किया, मुझे अभी भी लगता है कि यह उपयोगी हो सकता है अगर कोई मेरी जैसी समस्या पर ठोकर खाता है और जब मैं इस प्रश्न पर ठोकर खाई थी।
15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.