Xargs के साथ स्कैप करने के लिए पैरामीटर प्रदान करें


10

जब मैं दौड़ता हूं svn st | awk '{print $2}', मुझे मिलता है:

a.py
b.py
c.py

फिर मैं scpइन फाइलों को एक रिमोट सर्वर पर भेजना चाहता हूं । मैंने कोशिश की है:

svn st | awk '{print $2}' | xargs scp my_name@my_server:~/

लेकिन यह काम नहीं करता है। ऐसा करने के लिए सही आदेश क्या है?

धन्यवाद!

जवाबों:


10

इसे इस्तेमाल करे। xargs के हाल के संस्करणों के साथ काम करना चाहिए।

svn st | awk '{print $2}' | xargs -iz scp z my_name@my_server:

वैकल्पिक रूप से, आप फ़ाइलों को केवल लूप कर सकते हैं।

for file in $(svn st | awk '{print $2}'); do scp $file my_name@my_server: ; done


2
धन्यवाद टिम। मैंने बहुत svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/xargs
गुफ्तगू की

और आपका समाधान भी काम करता है! लेकिन एक टाइपो है, यह -Izनहीं है-iz
mitnk

आप कौन सा ओएस उपयोग कर रहे हैं? मैं -izसोलारिस का उपयोग करता हूं , और यह हमेशा काम करता है। सूचक के लिए धन्यवाद।
टिम केनेडी

4
POSIX xargs है -I। AIX (6.1) मैन पेज कहता -iहै कि यह अप्रचलित है और -Iइसका उपयोग किया जाना चाहिए। सोलारिस 10 (और 9) में दोनों -iऔर हैं -I
Mat

1
आह, मेरा ज्ञान अप्रचलित है! मैं -iSolaris 2.5 के बाद से उपयोग कर रहा हूं । बूढ़ा होना एक दुखद घटना है, मेरे दोस्त। :)
टिम कैनेडी

4

इसका कारण यह नहीं है कि आप xargsचलाने के लिए कह रहे हैं

scp my_name@my_server:~/ a.py b.py c.py

तर्कों का क्रम वह नहीं है जो आप करना चाहते हैं। एक समाधान यह है कि कमांड लाइन पर गंतव्य के सामने आने के लिए फ़ाइल नामों को बाध्य किया जाए। इसके लिए GNU xargs (यानी Linux या Cygwin) की आवश्यकता होती है। जब हम इस पर होते हैं, तो हम यह -d '\n'सुनिश्चित करने के लिए पास कर सकते हैं कि कोई भी फ़ाइल नाम जिसमें newlines नहीं है (बिना -d, xargs को इसके इनपुट के कुछ अजीब उद्धरण की उम्मीद है) काम करेगा; यदि आप विशिष्ट सॉफ़्टवेयर स्रोत पेड़ों के साथ काम करते हैं, तो यह आवश्यक नहीं है, जिसमें फ़ाइल नाम बहुत ही कठिन हो जाते हैं।

svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/

इस पद्धति का एक नकारात्मक पहलू यह है कि scpप्रत्येक फ़ाइल के लिए अलग से कहा जाता है। यदि आप बहुत सारी छोटी फ़ाइलों की नकल कर रहे हैं, तो यह एक महत्वपूर्ण अंतर बना सकता है, क्योंकि एसएसएच कनेक्शन स्थापित होने में थोड़ा समय लगता है। आप एसएसएच मास्टर कनेक्शन का उपयोग करके प्रति-कनेक्शन समय को बहुत कम कर सकते हैं (जो इस उत्तर के दायरे से बाहर है, मैनुअल देखें, विशेष रूप से ControlMasterऔर ControlPathविकल्प .ssh/config)।

तर्कों को सही स्थान पर रखने के लिए मजबूर करने का एक तरीका मध्यवर्ती खोल से गुजरना है। यह एक सामान्य तकनीक है तर्कों का उपयोग करते समय xargsया पुन: व्यवस्थित करने के लिए find … -exec

svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/

एक और संभावना के rsyncबजाय का उपयोग करने के लिए है scp। आप rsyncमानक इनपुट पर फ़ाइल नामों की सूची पास कर सकते हैं । चूंकि rsyncपैटर्न की सूची और फ़ाइल नामों की सूची नहीं होने की उम्मीद है, इसके लिए यह आवश्यक है कि आपके फ़ाइल नामों में कोई वाइल्डकार्ड वर्ण न हों (विशेष रूप से, कोई नया अंक, नहीं \[*?और कोई प्रारंभिक #या नहीं ;)।

svn st | awk '{print $2}' |
rsync -a --include-from=- --exclude='*' . my_name@my_server:~/
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.