tra-loi-cau-hoi-phat-trien-web.com

đệ quy sử dụng scp nhưng không bao gồm một số thư mục

Giả sử có một số thư mục với các cấu trúc này

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_1/image/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_1/image/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
....

Điều tôi muốn làm là scp các thư mục sau

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_1/image/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_1/image/

Như bạn có thể thấy tôi muốn sử dụng đệ quy scp nhưng loại trừ tất cả các thư mục có tên "fl_X". Có vẻ như scp không có lựa chọn như vậy.

UPDATE scp không có tính năng như vậy. Thay vào đó tôi sử dụng lệnh sau

 rsync -av --exclude 'fl_*' [email protected]:/my/dir

Nhưng nó không hoạt động. Nó chỉ chuyển danh sách các thư mục !! đại loại như ls -R

52
mahmood

Mặc dù scp hỗ trợ sao chép thư mục đệ quy với tùy chọn -r, nhưng nó không hỗ trợ lọc các tệp. Có một số cách để hoàn thành nhiệm vụ của bạn, nhưng tôi có thể sẽ dựa vào find, xargs, tar, và ssh thay vì scp.

find . -type d -wholename '*bench*/image' \
| xargs tar cf - \
| ssh [email protected] tar xf - -C /my/dir

Giải pháp rsync có thể được thực hiện để hoạt động, nhưng bạn đang thiếu một số đối số. rsync cũng cần chuyển đổi r để lặp lại thành các thư mục con. Ngoài ra, nếu bạn muốn bảo mật tương tự scp, bạn cần thực hiện chuyển khoản trong ssh. Cái gì đó như:

rsync -avr -e "ssh -l user" --exclude 'fl_*' ./bench* remote:/my/dir
44
jxh

Giả sử tùy chọn đơn giản nhất (cài đặt rsync trên Máy chủ từ xa) là không khả thi, bạn có thể sử dụng sshfs để gắn điều khiển từ xa cục bộ và rsync từ thư mục gắn kết. Bằng cách đó, bạn có thể sử dụng tất cả các tùy chọn mà rsync cung cấp, ví dụ --exclude.

Một cái gì đó như thế này nên làm:

sshfs [email protected]: sshfsdir
rsync --recursive --exclude=whatever sshfsdir/path/on/server /where/to/store

Lưu ý rằng hiệu quả của rsync (chỉ chuyển các thay đổi, không phải mọi thứ) không áp dụng ở đây. Điều này là do để hoạt động, rsync phải đọc mọi nội dung của tệp để xem những gì đã thay đổi. Tuy nhiên, vì rsync chỉ chạy trên một Máy chủ, toàn bộ tệp phải được chuyển đến đó (bằng sshfs). Các tập tin loại trừ không nên được chuyển, tuy nhiên.

11
Marian

Bạn có thể xuất GLOBIGNORE và sử dụng "*"

export GLOBIGNORE='ignore1:ignore2'
scp -r source/* remoteurl:remoteDir
7
Nautical

Nếu bạn sử dụng tệp pem để xác thực u, bạn có thể sử dụng lệnh sau (sẽ loại trừ các tệp có phần mở rộng nào đó):

rsync -Lavz -e "ssh -i <full-path-to-pem> -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --exclude "*.something" --progress <path inside local Host> <user>@<Host>:<path inside remote Host>

-L có nghĩa là theo liên kết (sao chép tệp không phải liên kết). Sử dụng đường dẫn đầy đủ đến tập tin pem của bạn và không tương đối.

Sử dụng sshfs không được khuyến khích vì nó hoạt động chậm. Ngoài ra, sự kết hợp giữa find và scp đã được trình bày ở trên cũng là một ý tưởng tồi vì nó sẽ mở một phiên ssh cho mỗi tệp quá đắt.

2
Ofer Eliassaf

Bạn có thể sử dụng Globing mở rộng như trong ví dụ dưới đây:

#Enable extglob
shopt -s extglob

cp -rv !(./excludeme/*.jpg) /var/destination
0
WackGet

Cái này hoạt động tốt với tôi vì cấu trúc thư mục không quan trọng đối với tôi.

scp -r [email protected]:~/bench1/?cpu/p_?/image/ .

Giả sử /bench1 nằm trong thư mục chính của người dùng hiện tại. Ngoài ra, thay đổi USER và HOSTNAME thành giá trị thực.

0
Fady Ibrahim