Cung cấp tham số cho scp với xargs


10

Khi tôi chạy svn st | awk '{print $2}', tôi nhận được:

a.py
b.py
c.py

Sau đó, tôi muốn scpcác tập tin này đến một máy chủ từ xa. Tôi đã thử:

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

Nhưng nó không hoạt động. Lệnh đúng để làm điều này là gì?

Cảm ơn bạn!

Câu trả lời:


10

thử cái này. nên làm việc với các phiên bản gần đây của xargs.

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

luân phiên, bạn chỉ có thể lặp qua các tập tin.

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


2
Cảm ơn bạn Tim. Tôi đã googled rất nhiều và tìm thấy giải pháp: svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/Tôi nên đọc trang người đàn ông xargstrước khi hỏi;)
mitnk

Và giải pháp của bạn cũng hoạt động! Nhưng có một lỗi đánh máy, -Izkhông phải vậy-iz
mitnk

bạn đang sử dụng hệ điều hành nào? Tôi sử dụng -iztrên Solaris, và nó luôn hoạt động. Cảm ơn con trỏ.
Tim Kennedy

4
XIX POSIX-I. Trang man AIX (6.1) cho biết -iđã lỗi thời và -Inên được sử dụng. Solaris 10 (và 9) có cả -i-I.
Mat

1
Ah, kiến ​​thức của tôi đã lỗi thời! Tôi đã sử dụng -itừ Solaris 2.5. già đi là một chuyện buồn, các bạn ạ. :)
Tim Kennedy

4

Lý do điều này không hiệu quả là bạn đang bảo xargschạy

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

Thứ tự của các đối số không tương ứng với những gì bạn muốn làm. Một giải pháp là buộc các tên tệp xuất hiện trước đích trên dòng lệnh. Điều này đòi hỏi GNU xargs (tức là Linux hoặc Cygwin). Trong khi chúng tôi đang ở đó, chúng tôi có thể vượt qua -d '\n'để đảm bảo rằng bất kỳ tên tệp nào không chứa dòng mới sẽ hoạt động (không có -d, xargs mong đợi một số trích dẫn kỳ lạ về đầu vào của nó); điều này là không cần thiết nếu bạn làm việc với các cây nguồn phần mềm điển hình, trong đó tên tệp có xu hướng rất thuần hóa.

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

Một nhược điểm của phương pháp này scplà được gọi riêng cho mỗi tệp. Nếu bạn đang sao chép nhiều tệp nhỏ, điều đó có thể tạo ra sự khác biệt đáng kể, vì kết nối SSH sẽ mất một chút thời gian để thiết lập. Bạn có thể rút ngắn đáng kể thời gian cho mỗi kết nối bằng cách sử dụng kết nối SSH chính (nằm ngoài phạm vi của câu trả lời này, xem hướng dẫn, đặc biệt là ControlMasterControlPathcác tùy chọn trong .ssh/config).

Một cách để buộc các đối số ở đúng vị trí là đi qua một lớp vỏ trung gian. Đây là một kỹ thuật chung để sắp xếp lại các đối số khi sử dụng xargshoặc find … -exec.

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

Một khả năng khác là sử dụng rsyncthay vì scp. Bạn có thể vượt qua rsyncmột danh sách các tên tệp trên đầu vào tiêu chuẩn. Vì rsyncmong đợi một danh sách các mẫu và không phải là danh sách các tên tệp, điều này yêu cầu tên tệp của bạn không chứa bất kỳ ký tự đại diện nào (cụ thể, không có dòng mới, không \[*?và không có chữ cái đầu #hoặc ;).

svn st | awk '{print $2}' |
rsync -a --include-from=- --exclude='*' . my_name@my_server:~/
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.