2009-07-10 24 views
31

Tôi đã bị kẹt trên một vấn đề dòng lệnh unix nhỏ.làm cách nào để nén toàn bộ cây thư mục trong Unix, nhưng chỉ một số tệp nhất định?

Tôi có một thư mục trang web (4gb) Tôi cần lấy một bản sao, nhưng chỉ các tệp .php, .html, .js và .css (chỉ có vài trăm kb).

Tôi đang nghĩ lý tưởng, có một cách để nén hoặc tar toàn bộ thư mục nhưng chỉ lấy một số phần mở rộng tệp nhất định, trong khi vẫn giữ lại cấu trúc thư mục con. Điều này có thể và nếu có, làm thế nào?

Tôi đã cố gắng thực hiện toàn bộ zip, sau đó xem xét và loại trừ một số tệp nhất định nhưng có vẻ hơi quá mức.

Tôi rất mới để kết hợp.

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.

+4

Bạn có thể nhận được kết quả tốt hơn nếu bạn hỏi này về serverfault.com (một trang web cụ sysadmin) –

Trả lời

38

Chuyển vào thư mục trang web, sau đó chạy

zip -R foo '*.php' '*.html' '*.js' '*.css' 

Bạn cũng có thể chạy từ bên ngoài thư mục website:

zip -r foo website_folder -i '*.php' '*.html' '*.js' '*.css' 
+0

Thao tác này sẽ không tìm thấy tệp phù hợp trong thư mục con. –

+2

cho mỗi manpage zip, bạn phải trích dẫn các đối số với dấu nháy đơn ... nếu không, tôi nghi ngờ rằng shell sẽ kết xuất chúng trước khi chuyển đến zip – kdgregory

+0

Thực ra, nó sẽ. -R cờ –

1

Bạn có thể viết tập lệnh shell để sao chép tệp dựa trên mẫu/biểu thức vào thư mục mới, nén nội dung và sau đó xóa thư mục. Bây giờ, như đối với cú pháp thực tế của nó, bệnh để lại cho bạn: D.

+1

Sao chép 4Gb dữ liệu? Tôi nghĩ rằng điều này nên được sử dụng như một báo cáo cuối cùng. – MitMaro

+0

Bạn sẽ không sao chép toàn bộ thư mục - chỉ các tệp phù hợp với mẫu. Bằng cách đó khi bạn tạo zip, bạn chỉ có thể nói zip tất cả, sau đó xóa. – barfoon

+1

@MitMaro OP cho biết nó chỉ là một vài hundres của KiB ... anyway, một phiên bản cải tiến có thể được thực hiện chỉ liên kết liên kết thay vì sao chép (nếu liên kết tượng trưng, ​​sau đó sử dụng -h với tar) ...và theo cách đó bạn có thể sử dụng lại chế độ xem của thư mục đó để sao lưu thêm :-) – fortran

14

Bạn có thể sử dụng findgrep để tạo ra danh sách tập tin, sau đó ống đó vào zip

ví dụ

find . | egrep "\.(html|css|js|php)$" | zip [email protected] test.zip 

([email protected] nói zip để đọc một danh sách tập tin từ stdin)

+4

Nếu bạn có một số lượng lớn các tập tin không phù hợp, nó sẽ có hiệu quả hơn một chút để làm một cái gì đó như 'tìm. -iname \ *. html -o -iname \ *. css -o -iname \ *. js -o -iname \ *. php' thay vì 'tìm. | grep ... '. –

3

bạn có thể muốn sử dụng tìm (GNU) để tìm tất cả php của bạn, html vv files.then tar chúng

find /path -type f \(-iname "*.php" -o -iname "*.css" -o -iname "*.js" -o -iname "*.ext" \) -exec tar -r --file=test.tar "{}" +; 

sau đó bạn có thể zip nó lên

+2

vấn đề với cách tiếp cận này là nó sẽ exec tar cho mỗi tập tin – kdgregory

+1

có nó. cách tiếp cận tốt hơn là sử dụng zip -R như một trong những bạn đã đăng. – ghostdog74

7

Đây là cách tôi cố gắng làm điều đó, nhưng tôi cũng giống như phiên bản ghostdog74 của.

tar -czvf archive.tgz `find test/ | egrep ".*\.html|.*\.php"` 

Bạn có thể thêm các tiện ích bổ sung bằng cách thêm chúng vào regex.

+1

bạn có thể gặp vấn đề với kích thước của danh sách đối số - xem xargs – kdgregory

4

Tôi thích câu trả lời của Nick, nhưng vì đây là trang web lập trình nên tại sao không sử dụng Ant để thực hiện việc này. :)

Sau đó, bạn có thể đặt tham số để các loại tệp khác nhau có thể được nén lên.

http://ant.apache.org/manual/Tasks/zip.html

+1

Tôi thấy kiến ​​hữu ích và tài liệu này khá dễ làm theo. –

Các vấn đề liên quan