2009-08-04 4 views
77

Tôi cần phải sao chép tất cả các tập tin .class từ máy chủ đến địa phương với tất cả các thư mục dành riêng. ví dụ. server:/usr/some/unknown/number/of/sub/folders/me.class sẽ là /usr/project/backup/some/unknown/number/of/sub/folders/me.class vấn đề là, có nhiều tệp vô dụng khác như tệp .svn-base mà tôi không muốn. làm thế nào tôi có thể lọc chúng để tôi chỉ scp .class file?Làm thế nào để lọc tệp khi sử dụng scp để sao chép thư mục đệ quy?

+0

Tôi thích tùy chọn rsync được đề cập. Bạn đã không đề cập đến nếu đây là một hoạt động một lần, hoặc nếu bạn sẽ tự động hóa điều này nhiều lần. Đối với một hoạt động một lần, việc sử dụng tìm kiếm, grep -v, xargs và các tệp tạm thời cần phải thực hiện công việc ngắn gọn. – user47559

Trả lời

117

tôi có lẽ muốn khuyên bạn sử dụng một cái gì đó giống như rsync cho do này để includeexclude nó cờ, ví dụ như: -

rsync -rav -e ssh --include '*/' --include='*.class' --exclude='*' \ 
server:/usr/some/unknown/number/of/sub/folders/ \ 
/usr/project/backup/some/unknown/number/of/sub/folders/ 

Một số cờ hữu ích khác:

  • -r cho đệ quy
  • -a để lưu trữ (chủ yếu là tất cả các tệp)
  • -v cho đầu ra verbose
  • -e để xác định ssh thay vì mặc định (mà phải được ssh, trên thực tế)
+3

Dù sao để làm cho thư mục con này bỏ qua không có các tệp lớp * trong chúng? (ví dụ: tôi không muốn một loạt các thư mục trống) –

+0

tuyệt vời và điều này cũng nhanh chóng xấu xa! –

+1

Bạn có thể giải thích - bao gồm, không --include = Trong trang MAN, tôi có thể tìm thấy lời giải thích trên --include = nhưng not --include – bazz

-1
  1. Sao chép thư mục nguồn của bạn để somedir:

    cp -r srcdirsomedir

  2. Hủy bỏ tất cả các file không cần thiết:

    tìm somedir -name 'svn' exec rm -rf {} \ +

  3. khởi chạy scp từ somedir

+0

lý do tại sao tất cả các downvotes về câu trả lời này? Điều này nghe có vẻ như là một giải pháp thông qua câu hỏi. – bcarroll

+3

Bởi vì điều này sẽ sao chép một loạt các tập tin không cần thiết sau đó xóa chúng, lãng phí tiềm năng rất nhiều thời gian. – Oded

+0

Đối với một chương trình trải qua một số bước biên dịch, điều này thực sự có ý nghĩa rất nhiều. Nó có thể đi ngay trước khi bước gói mã đã biên dịch vào tệp 'tar' hoặc' zip'. Thay vào đó, không có nén (scp không nén) và mã 'đóng gói' được sao chép. – samvv

32

Không có tính năng nào trong scp để lọc tệp. Đối với công cụ "tiên tiến" như thế này, tôi khuyên bạn nên sử dụng rsync:

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

(dòng này sao rsync từ thư mục ở xa đến hiện tại)

các phiên bản gần đây của đường hầm rsync qua một kết nối ssh tự động theo mặc định.

8

Vì bạn có thể scp bạn nên có ok để ssh,
một trong hai kịch bản sau đây hoặc đăng nhập và thực hiện ...

# After reaching the server of interest 
cd /usr/some/unknown/number/of/sub/folders 
tar cfj pack.tar.bz2 $(find . -type f -name *.class) 

trở lại (logout) đến máy chủ địa phương và scp,

# from the local machine 
cd /usr/project/backup/some/unknown/number/of/sub/folders 
scp [email protected]:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 . 
tar xfj pack.tar.bz2 

Nếu bạn tìm thấy những $(find ...) là quá dài đối với sự thay đổi của bạn để tar,

find . -type f -name *.class | xargs tar cfj pack.tar.bz2 

Cuối cùng, vì bạn đang giữ nó trong /usr/project/backup/,
tại sao bận tâm khai thác?Chỉ cần giữ tar.bz2, có thể là dấu ngày + giờ.

+0

Điều này đã giúp tôi. Tôi đang ở trong Windows và tôi đang cố gắng tìm cách cài đặt «rsync' và' ssh' trên hệ điều hành. Thay vào đó, đây là một cách giải quyết thông minh. Cảm ơn! – rayryeng

44

Để loại trừ dotfiles trong thư mục cơ sở:

scp -r [!.]* server:/path/to/something 
+8

Đây có lẽ là câu trả lời hay nhất; sử dụng globs để lọc các tập tin là cách để đi. –

+0

Nếu tùy chọn của bạn bị hạn chế để scp như tôi đã có, điều này chắc chắn đã giúp. – user28095

+0

Điều này cho biết loại trừ các tệp như được hỏi, nhưng làm cách nào để đạt được điều này cho toàn bộ thư mục? – Pille

1

Với xác thực dựa khoá ssh được kích hoạt, các kịch bản sau đây sẽ làm việc.

for x in `ssh [email protected] 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo '[email protected]:'$x) /usr/project/backup$y/; done 
0

Lệnh dưới đây cho tệp.

scp `find. -maxdepth 1 -name "* .log" \! -name "hs_err_pid2801.log" -type f` root @ IP:/tmp/test/

  1. IP sẽ là địa chỉ IP máy chủ đích.
  2. -name "* .log" để bao gồm các tệp.
  3. \! -name "hs_err_pid2801.log" để loại trừ tệp.
  4. . là thư mục làm việc hiện tại.
  5. -loại f cho loại tệp.

Lệnh dưới đây cho thư mục.

scp -r `find. -maxdepth 1 -name "lo *" \! -name "localhost" -type d` root @ IP:/tmp/test/

bạn có thể tùy chỉnh lệnh trên theo yêu cầu của bạn.