Scp'ye xargs ile parametreler sağlama


10

Ben koştuğum zaman svn st | awk '{print $2}', elde:

a.py
b.py
c.py

Sonra scpbu dosyaları uzak bir sunucuya istiyorum. Denedim:

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

Ama işe yaramıyor. Bunu yapmak için doğru komut nedir?

Teşekkür ederim!

Yanıtlar:


10

bunu dene. xargs'ın son sürümleriyle çalışmalıdır.

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

alternatif olarak, dosyalar üzerinden döngü yapabilirsiniz.

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


2
Teşekkürler Tim. Çok googled ve çözüm buldum: sormadan önce svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/adam sayfasını xargs
okumalıydım

Ve çözümünüz de işe yarıyor! Ama bir yazım hatası var, -Izdeğil-iz
mitnk

hangi işletim sistemini kullanıyorsunuz? -izSolaris üzerinde kullanıyorum ve her zaman işe yarıyor. İşaretçi için teşekkürler.
Tim Kennedy

4
POSIX xargs vardır -I. AIX (6.1) kılavuz sayfasının -ieski olduğunu ve -Ikullanılması gerektiğini söylüyor . Solaris 10 (9), hem de sahiptir -ive -I.
Mat

1
Ah, bilgim eski! -iSolaris 2.5'ten beri kullanıyorum . yaşlanmak üzücü bir durum, dostlarım. :)
Tim Kennedy

4

Bunun işe yaramamasının sebebi xargskoşmayı söylemen

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

Bağımsız değişkenlerin sırası, yapmak istediğiniz şeye karşılık gelmez. Bir çözüm, dosya adlarını komut satırındaki hedefin önünde görünmeye zorlamaktır. Bunun için GNU xargs (yani Linux veya Cygwin) gerekir. Biz -d '\n'oradayken, satırsonu içermeyen herhangi bir dosya adının çalışmasını sağlamak için geçebiliriz ( -dxargs, girdisinin garip bir şekilde alıntılanmasını beklemez); dosya adlarının çok uysal olduğu tipik yazılım kaynak ağaçları ile çalışıyorsanız bu gerekli değildir.

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

Bu yöntemin bir dezavantajı, scpher dosya için ayrı olarak adlandırılmasıdır. Çok sayıda küçük dosya kopyalıyorsanız, SSH bağlantısı kurmak biraz zaman aldığından, bu önemli bir fark yaratabilir. Büyük ölçüde (en başta, manuel bakınız bu cevap kapsamını outstide olduğu bir SSH ana bağlantı kullanarak bağlantı başına süresini kısaltabilir ControlMasterve ControlPathseçenekler içinde .ssh/config).

Argümanları doğru yerde olmaya zorlamanın bir yolu, bir ara kabuktan geçmektir. xargsVeya parametresini kullanırken argümanları yeniden sıralamak için genel bir tekniktir find … -exec.

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

Başka bir olasılık rsyncyerine kullanmaktır scp. rsyncStandart girişe dosya adlarının bir listesini iletebilirsiniz . Yana rsyncbeklentiden bir desen listesi ve dosya adlarının bir listesini, bu dosya adları herhangi joker karakterleri içermeyen gerektirir (özellikle hiçbir yeni satırlar, hayır \[*?ve hayır başlangıç #veya ;).

svn st | awk '{print $2}' |
rsync -a --include-from=- --exclude='*' . my_name@my_server:~/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.