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?
Trả lời
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 để include
và exclude
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ế)
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) –
tuyệt vời và điều này cũng nhanh chóng xấu xa! –
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
Sao chép thư mục nguồn của bạn để
somedir
:cp -r
srcdir
somedir
Hủy bỏ tất cả các file không cần thiết:
tìm somedir -name 'svn' exec rm -rf {} \ +
khởi chạy scp từ
somedir
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
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
Đố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
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.
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ờ.
Đ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
Để loại trừ dotfiles trong thư mục cơ sở:
scp -r [!.]* server:/path/to/something
Đâ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. –
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
Đ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
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
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/
- IP sẽ là địa chỉ IP máy chủ đích.
- -name "* .log" để bao gồm các tệp.
- \! -name "hs_err_pid2801.log" để loại trừ tệp.
- . là thư mục làm việc hiện tại.
- -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.
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