मैं एक कमांड में scp पर एक से अधिक फाइलें कैसे कॉपी कर सकता हूं?


20

मुझे बहुत सारी फाइलों को एक पीसी से दूसरे (दोनों लिनक्स) तक पहुंचाना है। मैं उस के लिए उपयोग करना चाहते हैं scp, लेकिन scpकेवल एक समय में एक फ़ाइल स्थानांतरित करने के लिए अनुमति देता है।

मैं यह कैसे कर सकता हूँ?

मेरे पास है

  • Rsync या किसी अन्य प्रोटोकॉल का उपयोग करने की कोई संभावना नहीं है
  • पासफ़्रेज़-मुक्त प्रमाणपत्र का उपयोग करने की कोई संभावना नहीं है (लेकिन पासफ़्रेज़ के साथ प्रमाणपत्र है)
  • स्थानांतरण के लिए फ़ाइलों की एक सूची और अन्य सर्वर पर फ़ाइलों के गंतव्य पथ के साथ एक सूची
  • फाइलें बहुत सारी निर्देशिकाओं में फैली हुई हैं, और निर्देशिका में सभी फाइलों को मैं कॉपी नहीं करना चाहता

यदि संभव हो, तो मैं बैंडविड्थ को बचाने के लिए पारदर्शी रूप से gzip और ungzip करना चाहूंगा!

क्या यह संभव है?

जवाबों:


31

उपयोग करें tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -

2
फ़ाइल प्रारूप का उपयोग करता है: "c मोड में, टार नाम फ़ाइल नाम से संग्रहीत होने के लिए पढ़ेगा। विशेष नाम -C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C ''।"
कुषा

14

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

मुझे पूरा यकीन है कि यह सच नहीं है, कम से कम scpOpenSH द्वारा प्रदान की गई कमांड के लिए नहीं, जिसमें अधिकांश लिनक्स वितरण शामिल हैं।

मैं scp file1 file2 ... fileN user@host:/destination/directory/काफी बार उपयोग करता हूं ।

पारदर्शी संपीड़न के लिए, SSH प्रोटोकॉल में यह बनाया गया है और scpयदि आप -Cकमांड लाइन पर विकल्प प्रदान करते हैं तो इसका उपयोग कर सकते हैं । समान छोटी फ़ाइलों में से कई के लिए आपको akira द्वारा सुझाए गए tar + gz विकल्प बेहतर संपीड़न मिलेगा क्योंकि यह ऐसी फ़ाइलों के बीच समानता का उपयोग कर सकता है जहां scpप्रत्येक फ़ाइल को एक अलग इकाई के रूप में संपीड़ित करता है। मैं आमतौर पर scp का उपयोग करना पसंद करता हूं, क्योंकि एक आंशिक हस्तांतरण को फिर से शुरू करना आसान है (या, हालांकि मुझे पता है कि इस स्थिति में प्रश्नकर्ता के पास विकल्प नहीं है) rsyncक्योंकि दोनों को फिर से शुरू करना आसान है और टार + gz विकल्प को पूरा साझा करता है। -स्ट्रीम संपीड़न लाभ।


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

4

scp -r yourdir otherhost:/otherdirकाम नहीं करता है?

इसे तब आजमाएँ:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

zटार को -flag संपीड़न करता है। या आप -C को ssh में उपयोग कर सकते हैं:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"

क्या करता -Cहै?
नाथन फेलमैन 8

1
समस्या यह है, मेरे पास फाइलों की एक सूची है। फाइलें बहुत सारी निर्देशिकाओं में फैली हुई हैं, और निर्देशिका में सभी फाइलों को मैं कॉपी नहीं करना चाहता हूं
पीटर स्मिट

2
@ नथन: -सी को लेट एसश को कम्प्रेशन करना है।
जिमी हेडमैन

1

RHEL5 पर, यहां एकमात्र तरीका संभव है कि मैं उन फ़ाइलों की एक सूची को सुरक्षित रूप से कॉपी करना जानता हूं जिनमें विशेष वर्ण (जैसे एक स्थान) शामिल हैं। एक शेल स्क्रिप्ट बनाएं और निम्नलिखित शामिल करें:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE

0

यह w / o बहुत तकलीफ दे सकता है।

मैं बस प्रत्येक फ़ाइल के बगल में होस्टनाम के साथ फाइलों की एक सूची बनाता हूं और लगता है कि यह ठीक है। अर्थात।

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

इस वाक्य रचना के साथ एसपीपी ठीक काम करता है। जैसा कि मैंने प्रत्येक फ़ाइल के बगल में होस्टनाम के बिना यह प्रयास किया, यह पहली फ़ाइल के बाद विफल हो गया। मुझे एक और वाक्यविन्यास याद आ रहा है जिसका मैंने पहले उपयोग किया था और एक बार इसे पोस्ट करने के बाद मैं इसे ढूँढूँगा।


यह काम करता है, लेकिन काफी धीमा है - यह प्रत्येक फ़ाइल के लिए एक कनेक्शन शुरू करने के लिए लगता है ... (मैं धीमी प्रतिलिपि के लिए एक समाधान की तलाश में यहां आया था ...) ~/ज्यादातर को छोड़ा जा सकता है - एससीपी घर निर्देशिका के सापेक्ष संचालित होता है। अगर आप कहीं और से एक सूची है $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(यह रिक्त स्थान के साथ फ़ाइल नाम के लिए टूट जाएगा)
Gert van den Berg

-1

मैं आपकी फ़ाइल सूची से एक संग्रह बनाने के लिए इस तरह से एक कमांड का उपयोग करने के लिए भागों की सिफारिश करूंगा

tar -cvf allfiles.tar -L mylist.txt

फिर आर्काइव को डाउनलोड करने के लिए scp का उपयोग करें।

scp user @ Remotehost: ~ / allfiles.tar

/programming/8033857/tar-archiving-that-takes-input-from-a-list-of-files

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