scp या sftp सिंगल कमांड के साथ कई फाइलों को कॉपी करता है


313

मैं विभिन्न निर्देशिकाओं में / दूरस्थ सर्वर से फाइल कॉपी करना चाहूंगा। उदाहरण के लिए, मैं एक बार में इन 4 कमांड को चलाना चाहता हूं।

scp remote:A/1.txt local:A/1.txt
scp remote:A/2.txt local:A/2.txt
scp remote:B/1.txt local:B/1.txt
scp remote:C/1.txt local:C/1.txt

ऐसा करने का सबसे आसान तरीका क्या है?


14
जब मैंने एक स्क्रिप्ट बनाई, तो मुझे प्रत्येक कमांड के लिए पासवर्ड डालना पड़ा। क्या मैं इससे बच सकता हूं?
user987654

11
इस तरह से पासवर्ड दोहराने से बचें: scp Remote: "A / 1.txt A / 2.txt B / 1.txt C / 1.txt" local: ./
JohnMudd

stackoverflow.com/a/23748561/874188 (इस एक के डुप्लीकेट के रूप में नामांकित) में एक अच्छी अतिरिक्त तकनीक है।
ट्रिपल

2
मेरा सुझाव है कि आप पर एक नज़र है rsync, हो सकता है कि यह इस मामले में और आने वाले कई मामलों में आपकी मदद कर सकता है। फिर, पासवर्ड दर्ज करने से बचने के लिए (कई बार अकेले जाने पर) आपको sshसार्वजनिक / निजी कुंजी के बारे में पढ़ना चाहिए , जैसे digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
mnagel

1
@JohnMudd के उत्तर पर आधारित उदाहरण scp root@192.168.56.120:'/etc/openvpn/ca.crt /etc/openvpn/client/client0.crt /etc/openvpn/client/client0.key /etc/openvpn/client/ta.key' ./:।
एडुआर्डो लुसियो

जवाबों:


418

दूरस्थ से स्थानीय करने के लिए कई फ़ाइलों की प्रतिलिपि बनाएँ:

$ scp your_username@remote.edu:/some/remote/directory/\{a,b,c\} ./

स्थानीय से दूरस्थ में कई फ़ाइलों की प्रतिलिपि बनाएँ:

$ scp foo.txt bar.txt your_username@remotehost.edu:~
$ scp {foo,bar}.txt your_username@remotehost.edu:~
$ scp *.txt your_username@remotehost.edu:~

रिमोट से कई फाइलों को कॉपी करें:

$ scp your_username@remote1.edu:/some/remote/directory/foobar.txt \
your_username@remote2.edu:/some/remote/directory/

स्रोत: http://www.hypexr.org/linux_scp_help.php


5
पहला कमांड समाप्त हो गया ",", और '{a, b, c}' बराबर \ {a, b, c \} है।
दुलशी

11
मुझे लगता है कि ओपी कई स्थानीय फ़ोल्डरों में कई फ़ाइलों को कई दूरस्थ फ़ोल्डरों में कॉपी करने की कोशिश कर रहा है, ये उदाहरण काम नहीं करेंगे, क्योंकि वे सभी फाइलों को केवल ~या ./केवल स्कैप करेंगे ।
aesede

20
खबरदार: घुंघराले ब्रेस के भीतर कॉमा के बाद कोई स्थान नहीं। मैंने सिर्फ 10 मिनट बिताए यह जानने की कोशिश कर रहा था कि मेरी कमान काम क्यों नहीं कर रही थी और यह रिक्त स्थान के कारण था।
गहरा

13
@duleshi {a, b, c} रिमोट से लोकल में कॉपी करते समय बिल्कुल {{a, b, c \} के बराबर नहीं होता, पहली के लिए प्रत्येक फाइल के लिए पासवर्ड की आवश्यकता होती है जबकि दूसरे के लिए केवल एक बार पासवर्ड की आवश्यकता होती है।
मार्सेलो वेंचुरा

15
@MarceloVentura, @duleshi: इसके अलावा, मैं यह जोड़ना चाहूंगा कि उपयोग \{a,b,c\}करने से फ़ाइलों को एक कनेक्शन / बैच में स्थानांतरित किया जाएगा (क्योंकि उन्हें दूरस्थ होस्ट पर विस्तारित किया जाएगा), जबकि उपयोग करने {a,b,c}से कई कनेक्शन खुलेंगे, और ओवरहेड है कई फ़ाइलों को स्थानांतरित करते समय काफी ध्यान देने योग्य
omninonsense

140

स्थानीय से सर्वर तक:

scp file1.txt file2.sh username@ip.of.server.copyto:~/pathtoupload

सर्वर से स्थानीय करने के लिए:

scp -T username@ip.of.server.copyfrom:"file1.txt file2.txt" "~/yourpathtocopy"


6
यह शीर्ष पर उत्तर होना चाहिए, क्योंकि सर्वर प्रत्येक फ़ाइल के लिए पासवर्ड नहीं
मांगता है

Ubuntu 18 (zsh) पर क्लाइंट पर काम नहीं कर रहा है। निश्चित नहीं कि यह कहां काम करना चाहिए। `` `(वेनव) it गिट: (मास्टर) root एससीपी रूट @ 172.29..xxx.yyy:" / usr / स्थानीय / बिन / kubectl /root/.kube/config / tmp / root @ 172.29..xxx। yyy का पासवर्ड: प्रोटोकॉल त्रुटि: फ़ाइल नाम अनुरोध से मेल नहीं खाता `` `
jseguillon

3
@ motagirl2 शीर्ष उत्तर प्रत्येक फ़ाइल के लिए तब तक पासवर्ड नहीं मांगता, जब तक आप बैकलैश के साथ घुंघराले कोष्ठक से बच रहे हों। यह उत्तर मुझे एक त्रुटि देता है कि फाइल नहीं मिल सकती है।
प्लूटो

1
@jseguillon -Tउस त्रुटि को दबाने के लिए विकल्प जोड़ें ।
मोनिका

1
दूसरा मेरे मशीनों पर काम करता है, लेकिन केवल टी विकल्प के बिना
रिचर्ड डायसाल्वो

71

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

scp -r ./dir-with-files user@remote-server:upload-path

scp -r user@remote-server:path-to-dir-with-files download-path

उदाहरण के लिए

scp -r root@192.168.1.100:/var/log ~/backup-logs

या अगर उनमें से कुछ ही है, तो आप उपयोग कर सकते हैं:

scp 1.txt 2.txt 3.log user@remote-server:upload-path

क्या यह काम करता है अगर मेरी मंजिल जड़ है और मैं उदाहरण के लिए जैसे निर्देशिका निर्देशिका कर रहा हूं: scp -r / backups / etc root @ linuxbox: / जहां मेरा स्रोत "मेजबानों" और nginx / साइटों जैसी चीजों के साथ एक बहुत ही दुर्लभ निर्देशिका है -उपलब्ध हैं आदि?
टॉमाची

47

जैसा कि जरी ने उल्लेख किया है, आप scp -r user@host:/some/remote/path /some/local/pathफ़ाइलों को पुनरावर्ती रूप से कॉपी करने के लिए उपयोग कर सकते हैं । यह मानता है कि एक ही निर्देशिका है जिसमें वे सभी फ़ाइलें हैं, जिन्हें आप स्थानांतरित करना चाहते हैं (और कुछ नहीं)।

हालाँकि, यदि आप कई अलग-अलग निर्देशिकाओं से फ़ाइलें स्थानांतरित करना चाहते हैं, तो SFTP एक विकल्प प्रदान करता है, और गंतव्य समान नहीं हैं:

sftp user@host << EOF
  get /some/remote/path1/file1 /some/local/path1/file1
  get /some/remote/path2/file2 /some/local/path2/file2
  get /some/remote/path3/file3 /some/local/path3/file3
EOF

यह SFTP इनपुट कमांड के अनुक्रम को परिभाषित करने के लिए "यहाँ डॉक्टर" सिंटैक्स का उपयोग करता है । एक विकल्प के रूप में, आप एसएफटीपी कमांड को एक टेक्स्ट फाइल में डाल सकते हैं और निष्पादित कर सकते हैंsftp user@host -b batchFile.txt


3
यह एकमात्र उत्तर है जो वास्तव में प्रश्न का उत्तर देता है। धन्यवाद। मैं Googling रहा हूं और scpइस सुविधा को खोजने के लिए बहुत लंबे समय से मैनुअल का विश्लेषण कर रहा हूं और मुझे लगता है कि scp के पास यह नहीं है।
sudo

1
यह सबसे अच्छा, सबसे लचीला जवाब लगता है। नोट: जब तक मुझे एहसास हुआ कि मुझे /home/vagrant/Code/इसके बजाय एक पूर्ण पथ का उपयोग करने की आवश्यकता है, तब तक मैं फंस गया ~/Code/
रयान

यह सबसे अच्छा जवाब है, बस - rनिर्देशिकाओं के लिए जोड़ना मत भूलना
क्रिस_रैंड्स

25

{file1,file2,file3}केवल बैश (दूरस्थ या स्थानीय रूप से) के साथ काम करता है

वास्तविक तरीका यह है:

scp user@remote:'/path1/file1 /path2/file2 /path3/file3' /localPath

1
बहुत खुबस! मैं कभी-कभी गैर-बैश के गोले का उपयोग करता हूं और यह बहुत मदद करता है। न केवल वास्तविक तरीका, बल्कि सही तरीका।
पॉल बी।

1
बाश {…, …, …}में ही नहीं, कई गोले में काम करने वाले ग्लोबिंग । हालांकि यह किसी भी शेल में काम करता है इसलिए स्पष्ट रूप से बेहतर है।
पियोट्र डोब्रोगोस्ट 15

अधिक उद्धृत करने की आवश्यकता है। उन रास्तों में जगह हो सकती है।
अमित नायडू

1
हम वहाँ चलें! मुझे लगता है कि कई बार upvote, लेकिन मैं सिर्फ एक बार कर सकते हैं! शुक्रिया वाउज़!
एंड्रे पाचेको

17

थोड़ी देर के लिए scp के साथ खेलने के बाद मुझे सबसे मजबूत समाधान मिला है:

(एकल और दोहरे उद्धरण चिह्नों से सावधान रहें)

स्थानीय से दूरस्थ:

scp -r "FILE1" "FILE2" HOST:'"DIR"'

दूरस्थ से स्थानीय:

scp -r HOST:'"FILE1" "FILE2"' "DIR"

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

यदि फाइलें सभी एक ही निर्देशिका में हैं, तो हम उन सभी से मिलान करने के लिए * का उपयोग कर सकते हैं, जैसे कि

scp -r "DIR_IN"/*.txt HOST:'"DIR"'
scp -r HOST:'"DIR_IN"/*.txt' "DIR"

"{}" सिंटैक्स का उपयोग करने की तुलना में जो केवल कुछ गोले द्वारा समर्थित है, यह एक सार्वभौमिक है


फ़ाइल नामों में रिक्त स्थान की मदद करने के लिए धन्यवाद। मैं {} दृष्टिकोण का उपयोग कर रहा था, इसलिए मुझे भी उद्धृत करने के बाद उनके साथ भागना पड़ा।
नोमेनन

3
यदि आप पथ में अपने घर निर्देशिका के लिए टिल्ड वर्ण (~) का उपयोग करना चाहते हैं। ध्यान दें कि कैसे ~ और / उद्धरण के बाहर होना चाहिए। `` `scp -r robwaa@192.168.1.101: '~ /" बिन / सेट-वीपीएन-किल-स्विच "~ /" बिन / फ्लश-आईपाइटल "" ~ / "" `"
रोब वाया

{}वाक्य रचना यह आसान एक ही निर्देशिका से एक से अधिक फ़ाइलों की प्रतिलिपि बनाने के लिए बनाता है, वहाँ के साथ ऐसा करना किसी भी तरह से है scp -r, ताकि "FILE1" "FILE2"संबंधित पथ और फ़ाइलों के लिए पूर्ण नहीं रास्तों हो सकता है?
dtasev

15

सबसे सरल तरीका है

local$ scp remote:{A/1,A/2,B/3,C/4}.txt ./

इसलिए {..} सूची में निर्देशिकाएं शामिल हो सकती हैं (ए, बी और सी यहां निर्देशिकाएं हैं; "1.txt" और "2.txt" उन निर्देशिकाओं में फ़ाइल नाम हैं)।

यद्यपि यह इन चारों फाइलों को एक स्थानीय निर्देशिका में कॉपी कर देगा - निश्चित नहीं कि अगर आप चाहते थे।

उपरोक्त मामले में आप दूरस्थ फ़ाइलों को समाप्त कर देंगे A / 1.txt, A / 2.txt, B / 3.txt और C / 4.txt को एक ही स्थानीय निर्देशिका में फ़ाइल नाम के साथ कॉपी किया गया ।/1.txt, ./2.txt, ./3.txt और ./4.txt


क्या यह स्थानीय मशीन पर B / 1.txt की सामग्री के साथ A / 1.txt की सामग्री को अधिलेखित नहीं करेगा?
यवेस डोरफ्समैन

अच्छा बिंदु .. समायोजित उदाहरण (इसलिए अब यह अधिलेखित नहीं होगा) और विवरण जोड़ा। धन्यवाद।
तगर

इस तरह ब्रेस विस्तार एक बैश सुविधा है, और POSIX जैसे पोर्टेबल नहीं है sh
ट्रिपल

1
@tripleee, धन्यवाद। यह पॉज़िक्स नहीं हो सकता है, लेकिन यह न केवल बाश में काम करता है। मैं हर समय ksh का उपयोग करता हूं और यह वहां भी काम करता है।
तगर

1
आप dirs और files को मिक्स करके भी कर सकते हैं:local$ scp -r remote:{A/1.txt,A/2.txt,B/3.txt,C/4.txt,D,F} ./
donhector

13

समस्या : एक SCP कमांड का उपयोग करके दूरस्थ निर्देशिका से स्थानीय मशीन तक कई निर्देशिकाओं की प्रतिलिपि बनाना और प्रत्येक निर्देशिका को दूरस्थ सर्वर में बनाए रखना।

समाधान : एससीपी यह आसानी से कर सकता है। यह कई फ़ोल्डरों के साथ SCP का उपयोग करते समय पासवर्ड दर्ज करने की कष्टप्रद समस्या को हल करता है। नतीजतन, यह भी बहुत समय बचाता है!

जैसे

# copies folders t1, t2, t3 from `test` to your local working directory
# note that there shouldn't be any space in between the folder names;
# we also escape the braces.
# please note the dot at the end of the SCP command

~$ cd ~/working/directory
~$ scp -r username@contact.server.de:/work/datasets/images/test/\{t1,t2,t3\}  .

पुनश्च: इस महान जवाब से प्रेरित: एसपीपी या sftp एकल कमांड के साथ कई फ़ाइलों की प्रतिलिपि बनाएँ


टिप्पणियों के आधार पर, यह विंडोज पर गिट बैश में भी ठीक काम करता है


3
पुनश्च आइटम के बीच रिक्त स्थान नहीं जोड़ते हैं। यानी \ {t1, t2, t3 \} ------> मैंने यहां दस मिनट बर्बाद किए ... lol
kenberkeley

1
यह सबसे अच्छा उत्तर है क्योंकि जब आप ब्रेसिज़ से बचते हैं तो इसे एकल कमांड के रूप में व्याख्या किया जाएगा और यह प्रत्येक हस्तांतरण के लिए पासवर्ड नहीं मांगेगा
Amaynut

@ अमयंट हां, बिल्कुल! यह निश्चित रूप से बहुत समय और प्रयास बचाता है :)
kmario23

12

कई निर्देशिकाओं की प्रतिलिपि बनाएँ:

scp -r dir1 dir2 dir3 admin@127.0.0.1:~/

प्रश्न यह था कि दूरस्थ निर्देशिका से स्थानीय एक पर कैसे प्रतिलिपि बनाई जाए, अन्य तरीके से नहीं।
तगर

5

आप इस तरह से कर सकते हैं:

scp hostname@serverNameOrServerIp:/path/to/files/\\{file1,file2,file3\\}.fileExtension ./

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

सुनिश्चित करें कि प्रत्येक फ़ाइल नाम के बीच रिक्त स्थान न रखें, केवल अल्पविराम का उपयोग करें ,


1
यह अच्छा है जब एक्सटेंशन समान है। यह लिखा जा सकता है जैसे /path/to/files/\\{file1.ext,file2.ext,file3.ext\\}कि फाइलों में अलग-अलग एक्सटेंशन होते हैं। PowerShell के लोगों पर ध्यान दें (अब जो MS पार्टी में शामिल हो गया है) आपको `इसके बजाय भागने के लिए उपयोग करना होगा:/path/to/files/`{file1.ext,file2.ext,file3.ext`}
dtasev

3

नोट: मैं उपरोक्त प्रश्न के केवल एक हिस्से का जवाब देने के लिए अग्रिम में माफी चाहता हूं। हालाँकि, मुझे ये आदेश मेरी वर्तमान यूनिक्स जरूरतों के लिए उपयोगी लगे।

किसी स्थानीय मशीन से दूरस्थ मशीन पर विशिष्ट फाइलें अपलोड करना:

~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/

स्थानीय मशीन से दूरस्थ मशीन पर संपूर्ण निर्देशिका अपलोड करना:

~$ scp -r Desktop/dump_files your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/

दूरस्थ मशीन से स्थानीय मशीन में संपूर्ण निर्देशिका डाउनलोड करना:

~/Desktop$ scp -r your-user-id@remote.host.edu:Public/web/ Desktop/


3

मेरे मामले में, मैं केवल sftp कमांड का उपयोग करने के लिए प्रतिबंधित हूं।
इसलिए, मुझे sftp के साथ एक बैचफाइल का उपयोग करना पड़ा। मैंने एक स्क्रिप्ट बनाई जैसे कि निम्नलिखित। यह मानता है कि आप / tmp निर्देशिका में काम कर रहे हैं, और आप दूरस्थ सिस्टम पर फाइल को destdir_on_remote_system में रखना चाहते हैं। यह भी केवल एक गैर-सक्रिय लॉगिन के साथ काम करता है। आपको सार्वजनिक / निजी कुंजी सेट करने की आवश्यकता है ताकि आप पासवर्ड दर्ज किए बिना लॉगिन कर सकें। आवश्यकतानुसार बदलें।

#!/bin/bash

cd /tmp
# start script with list of files to transfer
ls -1 fileset1* > batchfile1
ls -1 fileset2* >> batchfile1

sed -i -e 's/^/put /' batchfile1
echo "cd destdir_on_remote_system" > batchfile
cat batchfile1 >> batchfile
rm batchfile1

sftp -b batchfile user@host

2

आपकी कमांड सही काम करती है लेकिन, मैं स्थानीय में रिमोट भेजते समय फ़ाइल का नाम भी बदलना चाहता हूं। मैंने एक कमांड लिखी: - sshpass -p पासवर्ड scp /path/to/file.txt root @ hostname: /path/newfile.txt

लेकिन यह त्रुटि देता है कि /path/newfile.txt: ऐसी कोई फ़ाइल या निर्देशिका नहीं मिली जो इस स्थिति में मेरी मदद करें


सुनिश्चित करें कि दूरस्थ निर्देशिका hostname:/path/वास्तव में मौजूद है और सुलभ है।
अमित नायडू

1

scp एक ही प्रमाणीकरण के साथ डेटा ट्रांसफर के लिए ssh का उपयोग करता है और ssh के समान सुरक्षा प्रदान करता है।

यहाँ एक सबसे अच्छा अभ्यास "SSH कुंजी और सार्वजनिक कुंजी स्वचालन" को लागू करना है। इसके साथ, आप प्रमाणीकरण के बारे में चिंता किए बिना अपनी स्क्रिप्ट लिख सकते हैं। इतना ही आसान।

देखें क्या SSH-KEYGEN है


1

विशिष्ट मामले में जहां सभी फाइलों में एक ही एक्सटेंशन होता है, लेकिन विभिन्न प्रत्यय (लॉग फाइल की संख्या) के साथ आप निम्नलिखित का उपयोग करते हैं:

scp user_name@ip.of.remote.machine:/some/log/folder/some_log_file.* ./

यह रिमोट के भीतर दिए गए फ़ोल्डर से some_log_file नाम की सभी फ़ाइलों को कॉपी करेगा, अर्थात- some_log_file.1, some_log_file.2, some_log_file.3 ...।


-1
scp remote:"[A-C]/[12].txt" local:

धन्यवाद, लेकिन यह सिर्फ एक उदाहरण है, और वास्तविक फ़ाइल या निर्देशिका का नाम अधिक जटिल है। लेकिन मेरे पास उनकी एक सूची है।
user987654

क्या आप एक नियमित अभिव्यक्ति द्वारा उन का वर्णन कर सकते हैं?
3'13

क्या नियमित अभिव्यक्ति का उपयोग करके लक्ष्य निर्देशिका में समान निर्देशिका संरचना को संरक्षित करना संभव है?
user987654

1
हां, आपको -rविकल्प के साथ ऐसा करने में सक्षम होना चाहिए scp। और आप -pविकल्प के साथ अन्य विशेषताओं (जैसे समय टिकट) को संरक्षित कर सकते हैं ।
2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.