สาเหตุที่ใช้ไม่ได้คือคุณกำลังบอกxargs
ให้เรียกใช้
scp my_name@my_server:~/ a.py b.py c.py
ลำดับของอาร์กิวเมนต์ไม่ตรงกับสิ่งที่คุณต้องการทำ ทางออกหนึ่งคือบังคับให้ชื่อไฟล์ปรากฏต่อหน้าปลายทางในบรรทัดคำสั่ง สิ่งนี้ต้องใช้ GNU xargs (เช่น Linux หรือ Cygwin) ในขณะที่เรากำลังที่จะให้เราสามารถส่งผ่าน-d '\n'
เพื่อให้แน่ใจว่าชื่อไฟล์ใด ๆ ที่ไม่ได้มีการขึ้นบรรทัดใหม่จะทำงาน (โดยไม่-d
, xargs คาดว่าบางแปลก quoting ของปัจจัยการผลิต); นี่ไม่จำเป็นถ้าคุณทำงานกับซอร์สซอฟต์แวร์ทั่วไปซึ่งชื่อไฟล์มักจะเชื่องมาก
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
ข้อเสียของวิธีนี้scp
คือเรียกว่าแยกต่างหากสำหรับทุกไฟล์ หากคุณกำลังคัดลอกไฟล์ขนาดเล็กจำนวนมากนั่นอาจสร้างความแตกต่างอย่างมีนัยสำคัญเนื่องจากการเชื่อมต่อ SSH ใช้เวลาสร้างเล็กน้อย คุณสามารถลดเวลาในการเชื่อมต่อได้อย่างมากโดยใช้การเชื่อมต่อหลัก SSH (ที่อยู่นอกขอบเขตของคำตอบนี้ดูคู่มือโดยเฉพาะอย่างยิ่งในตัวเลือก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:~/
svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/
ฉันควรจะได้อ่านหน้าคนของxargs
ก่อนที่จะถาม;)