How to _MOVE_ scp वाली फाइलें?


46

कैसे एक सर्वर से दूसरे (दोनों लिनक्स) पर फ़ाइलों को कॉपी न करें बल्कि स्थानांतरित करें?

man scpमुझे कुछ भी उपयोगी नहीं दिया। मैं 'scp' तब 'rm' का उपयोग नहीं कर सकता क्योंकि मुझे यह सुनिश्चित करना चाहिए कि फ़ाइल सफलतापूर्वक स्थानांतरित हो जाए। यदि स्थानांतरण के दौरान कोई त्रुटि है, तो फ़ाइल को हटाया नहीं जाना चाहिए।

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

शायद एससीपी के अलावा भी कुछ है?

जवाबों:


47

ss पर rsync संभवतः --remove-source-filesविकल्प के साथ आपकी सबसे अच्छी शर्त है

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

एक त्वरित परीक्षण देता है;

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

जैसा कि @SvenW ने उल्लेख किया है, -e sshडिफ़ॉल्ट है इसलिए छोड़ा जा सकता है।


7
-e sshअब कई वर्षों के लिए अंतर्निहित डिफ़ॉल्ट है, आमतौर पर इस पैरामीटर का उपयोग करने की कोई आवश्यकता नहीं है।
स्वेन

@SvenW आह अच्छा पता करने के लिए! मैं rsync दिन के लिए दिन की जरूरत नहीं है क्योंकि scp अधिकांश प्रयोजनों के लिए पुनरावर्ती मोड का समर्थन करता है।
टॉम एच

इसके बाद किसी भी खाली फ़ोल्डर को साफ करने के लिए इसका उपयोग करें (rsync उन्हें नहीं निकालेगा): serverfault.com/a/95935/58568
bmaupin

1
बस smv() { rsync -az --remove-source-files "$@"; }मेरे टूलबॉक्स में जोड़ा गया। धन्यवाद।
Rhys Ulerich

यदि आपके पास rsync नहीं है तो क्या होगा? उदाहरण के लिए OpenWrt में rsync नहीं है और मुझे फ़ाइलों को स्थानांतरित करने के लिए scp का उपयोग करने की आवश्यकता है। अब क्या करे?
वैलेंटाइन

19

rsyncइसके बजाय का उपयोग करें scp:

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 

अधिक जानकारी के साथ man rsync


17

इस सवाल का ठीक-ठीक उत्तर दिया गया है, और उत्तर को स्वीकार कर लिया गया है, लेकिन चूंकि यह सामने वाले पृष्ठ के शीर्ष पर तैर रहा है, मैंने सोचा कि मैं कम से कम इसका उत्तर देने की कोशिश करूंगा, अगर कम सुरुचिपूर्ण ढंग से। हां, आप रिटर्न कोड का उपयोग कर सकते हैं scp, और मैं इसे अक्सर करता हूं। इन bash:

scp foo user@server:/destination && rm foo

मैं आपकी फ़ाइलों को कॉपी करने और ढेर के नीचे विफलता को सही ढंग से संभालने के लिए कई फाइलों के बारे में बात करता हूं, इसलिए कई फाइलों के लिए:

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

यदि आप उपयोग कर रहे हैं तो यह अंतिम व्यावहारिक है ssh-agent, लेकिन मुझे बहुत उम्मीद है कि आप हैं।


1
मुझे लगता है कि इसका जवाब होना चाहिए था। यह पूछे गए प्रश्न का सटीक उत्तर देता है।
ट्रैविस ग्रिग्स

एससीपी हैंडल नहीं करता है (एएफएआईके) बैंडविथ लिमिटेशन के रूप में, मैंने एक परिभाषित बैंडवाइथ पर एक-एक करके फाइलों को स्थानांतरित करने के लिए rsync के साथ आपके हैंसवेयर का उपयोग किया। धन्यवाद !
मूनचाइल्ड

@Moonchild, scp वास्तव में -lध्वज का उपयोग करके बैंडविड्थ सीमाओं को संभाल सकता है । जैसे, -l 81928192 kb / s पर
स्पेंसर

3

मेरी स्थिति में, ssh पोर्ट 22 नहीं है, इसलिए

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

मेरे लिये कार्य करता है।


5
आप कस्टम ssh पोर्ट नंबर को अपने ssh config फाइल (~ / .ssh / config) में हर कमांड पर निर्दिष्ट करने से बेहतर हैं। यह विश्व स्तर पर, प्रति-होस्ट या होस्टनाम से मेल खाते एक नियमित अभिव्यक्ति के लिए निर्दिष्ट किया जा सकता है।
चुपके

स्रोत और गंतव्य दोनों के लिए व्यक्तिगत रूप से पोर्ट कैसे सेट करें?
ब्रेथलॉज़

3

यदि आपके पास पुराना लक्ष्य सर्वर है जैसा कि मैं करता हूं, तो आप उपयोग नहीं कर सकते

--remove-source-files

लेकिन आपको उपयोग करना होगा

--remove-sent-files --protocol=29

बजाय।


3

यदि इसे दो चरणों में करना कोई समस्या नहीं है, तो आप scpफ़ाइल को दूरस्थ सर्वर से कॉपी करने के लिए उपयोग कर सकते हैं , और फिर ssh -e "rm /path/to/file"डिस्क से हटाने के लिए निष्पादित कर सकते हैं। विशेष रूप से मशीनों की चीज़ों के बीच फ़ाइलों को ले जाने में गलतियाँ हो सकती हैं, इसलिए कॉपी और डिलीट को अलग-अलग करना अच्छा हो सकता है, और केवल फाइल को हटा दें जब आपको पता चले कि यह पहले सफलतापूर्वक कॉपी किया जा चुका है।

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