सवाल Scp के साथ _MOVE_ फ़ाइलों को कैसे करें?


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

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

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

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


40
2018-02-26 20:11


मूल




जवाब:


एसएसएच पर 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 डिफ़ॉल्ट है इसलिए छोड़ा जा सकता है।


41
2018-02-26 20:15



-e ssh कई सालों से अंतर्निहित डिफ़ॉल्ट है, आमतौर पर इस पैरामीटर का उपयोग करने की आवश्यकता नहीं है। - Sven♦
@SvenW आह जानना अच्छा है! मुझे दिन-प्रतिदिन rsync की बहुत आवश्यकता नहीं है क्योंकि अधिकांश प्रयोजनों के लिए एसपीपी रिकर्सिव मोड का समर्थन करता है। - Tom H
इसके बाद किसी भी खाली फ़ोल्डर को साफ करने के लिए इसका उपयोग करें (rsync उन्हें हटा नहीं देगा): serverfault.com/a/95935/58568 - bmaupin
अभी जोड़ा गया smv() { rsync -az --remove-source-files "$@"; } मेरे टूलबॉक्स में। धन्यवाद। - Rhys Ulerich
अगर आपके पास rsync नहीं है तो क्या होगा? उदाहरण के लिए OpenWrt में rsync नहीं है और मुझे फ़ाइलों को स्थानांतरित करने के लिए scp का उपयोग करने की आवश्यकता है। अब क्या करे? - valentt


उपयोग rsync के बजाय scp:

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

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


16
2018-02-26 20:18





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

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

मैं स्टैक को ठीक से नीचे विफलता की प्रतिलिपि बनाने और संभालने के लिए एकाधिक फ़ाइलों के बारे में अपना बिंदु लेता हूं, इसलिए एकाधिक फ़ाइलों के लिए:

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

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


15
2018-04-18 14:23



मुझे लगता है कि यह जवाब होना चाहिए था। यह ठीक से पूछे गए सवाल का जवाब देता है। - Travis Griggs
चूंकि एससीपी (AFAIK) बैंडविड्थ सीमा को संभाल नहीं पाता है, इसलिए मैंने एक परिभाषित बैंडविड्थ पर फ़ाइलों को एक-एक करके स्थानांतरित करने के लिए rsync के साथ अपने hanswer का उपयोग किया। धन्यवाद ! - Moonchild
@ मूनचिल्ड, एसपीपी वास्तव में बैंडविड्थ सीमाओं का उपयोग कर संभाल सकता है -l झंडा। जैसे, -l 8192 8192 केबी / एस पर स्थानान्तरण सीमित करने के लिए - Spencer Doak


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

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

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


2
2017-09-24 05:47



आप प्रत्येक एसएसपी कॉन्फ़िगरेशन फ़ाइल (~ / .ssh / config) में कस्टम एसएसएच पोर्ट नंबरों को प्रत्येक कमांड के लिए निर्दिष्ट करने से कहीं अधिक बेहतर हैं। इसे वैश्विक रूप से, प्रति-होस्ट, या मेजबाननाम से मेल खाने वाली नियमित अभिव्यक्ति के लिए निर्दिष्ट किया जा सकता है। - sneak
स्रोत और गंतव्य दोनों के लिए अलग-अलग बंदरगाह कैसे सेट करें? - Brethlosze


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

--remove-source-files

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

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

बजाय।


2
2018-01-23 17:23





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


2
2017-07-01 08:39