Alasan mengapa ini tidak berhasil adalah karena Anda disuruh xargs
lari
scp my_name@my_server:~/ a.py b.py c.py
Urutan argumen tidak sesuai dengan apa yang ingin Anda lakukan. Salah satu solusinya adalah memaksa nama file muncul sebelum tujuan pada baris perintah. Ini membutuhkan GNU xargs (yaitu Linux atau Cygwin). Sementara kita melakukannya, kita dapat -d '\n'
memastikan bahwa setiap nama file yang tidak mengandung baris baru akan berfungsi (tanpa -d
, xargs mengharapkan beberapa kutipan aneh dari inputnya); ini tidak perlu jika Anda bekerja dengan pohon sumber perangkat lunak khas, di mana nama file cenderung sangat jinak.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
Kelemahan dari metode ini adalah yang scp
dipanggil secara terpisah untuk setiap file. Jika Anda menyalin banyak file kecil, itu bisa membuat perbedaan yang signifikan, karena koneksi SSH membutuhkan waktu agak lama untuk dibuat. Anda dapat mempersingkat waktu per-koneksi dengan menggunakan koneksi master SSH (yang melampaui cakupan jawaban ini, lihat manual, terutama opsi ControlMaster
dan ControlPath
di dalamnya .ssh/config
).
Cara untuk memaksa argumen berada di tempat yang tepat adalah melalui shell perantara. Ini adalah teknik umum untuk menyusun ulang argumen saat menggunakan xargs
atau find … -exec
.
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
Kemungkinan lain adalah menggunakan rsync
bukan scp
. Anda dapat melewati rsync
daftar nama file pada input standar. Karena rsync
mengharapkan daftar pola dan bukan daftar nama file, ini mensyaratkan bahwa nama file Anda tidak mengandung karakter wildcard (khusus, tidak ada baris baru, tidak ada \[*?
dan tidak ada inisial #
atau ;
).
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:~/
Seharusnya saya membaca halaman manualxargs
sebelum bertanya;)