Câu trả lời:
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
-Iz
không phải vậy-iz
-iz
trên Solaris, và nó luôn hoạt động. Cảm ơn con trỏ.
-i
từ Solaris 2.5. già đi là một chuyện buồn, các bạn ạ. :)
Lý do điều này không hiệu quả là bạn đang bảo xargs
chạ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 scp
là đượ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à ControlMaster
và ControlPath
cá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 xargs
hoặ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 rsync
thay vì scp
. Bạn có thể vượt qua rsync
một danh sách các tên tệp trên đầu vào tiêu chuẩn. Vì rsync
mong đợ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:~/
svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/
Tôi nên đọc trang người đàn ôngxargs
trước khi hỏi;)