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
-Izkhông phải vậy-iz
-iztrên Solaris, và nó luôn hoạt động. Cảm ơn con trỏ.
-itừ 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 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à ControlMastervà ControlPathcá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:~/
svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/Tôi nên đọc trang người đàn ôngxargstrước khi hỏi;)