Tôi muốn đầu ra ống tìm vào danh sách đầu vào của scp, làm thế nào?


10

Tôi là người dùng linux mới làm quen và tôi đang cố gắng gửi một danh sách dài các tệp từ máy tính này sang máy tính khác. Danh sách đối số quá dài, vì vậy tôi đang sử dụng find. Tôi đang gặp khó khăn khi thiết lập biểu thức, mặc dù. Ai đó có thể giúp gì không?

Đây là những gì tôi thường gõ cho một danh sách đối số ngắn.

scp ./* phogan@computer/directory...

Đây là tôi nghĩ rằng điều này có thể dịch sang tìm.

scp find . -name "*" phogan@computer/directory...

Có lẽ tôi có thể sử dụng đường ống? Bất kỳ đề nghị sẽ giúp. Cảm ơn trước.

Câu trả lời:


16
find . -name "*" -exec scp '{}' phogan@computer:/directory ';'

Thông thường tôi sẽ 'tar' tất cả các tệp cùng nhau thành một đốm lớn và gọi 'scp' chỉ một lần. Một cái gì đó như thế này:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Người ta có thể chơi xung quanh với các tham số --exclude = hoặc --include = tar.
  • Một lựa chọn khác là sử dụng rsync .

Nếu sử dụng mật khẩu với ssh / scp, liệu giải pháp tìm kiếm có yêu cầu mật khẩu trên mỗi tệp không?
quack quixote

giả sử anh ta biết cách sử dụng khóa ssh :) vấn đề với 1000 câu hỏi mật khẩu cũng là lý do cho cách tiếp cận tar
akira

15

Bạn có thể làm điều đó chỉ với một lệnh scp.

  • cho các phiên bản mới hơn của scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • cho các phiên bản cũ hơn:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

Đảm bảo đóng gói findlệnh ở giữa backticks ` và không trích dẫn đơn ' .


Phiên bản scp nào, linux nào phân phối nó? Ví dụ: scp trong Ubuntu 14.04 không có tùy chọn này.
geekQ

2
Xin chào, các phiên bản cũ hơn hỗ trợ nó, các phiên bản mới hỗ trợ một lệnh đơn giản hơn:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Coleues

1
Không hoạt động trên nhiều tệp
Amruta

@Amruta sử dụng-r
slybloty

@slybloty scp -rdành cho đệ quy trên một mục (thư mục), không dành cho nhiều mục (nhiều tệp).
AndrewF

2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done

vâng, dù sao anh ta cũng muốn một lệnh duy nhất
John T

hữu ích, được sử dụng vớigrep -l pattern *
Tanj

Dường như không hoạt động trên các tệp có không gian trong đó.
Barshe De Troyer

1

Tôi sẽ đề nghị

find . -print0 | tar --null --files-from=/dev/stdin -cf - | ssh phogan@computer tar -xf - -C /directory

Lưu ý rằng giải pháp này tránh việc có tên tệp trên dòng lệnh nơi chúng có thể được hiểu là đối số dòng lệnh.

Một điều khác cần chú ý là tên tệp có thể chứa khoảng trắng. Điều này có nghĩa là một vòng lặp for trong bash có thể gặp khó khăn với danh sách tên tệp.

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.