Làm cách nào tôi có thể tạo một kho lưu trữ zip của toàn bộ thư mục qua thiết bị đầu cuối mà không có tệp ẩn?


220

Tôi có một dự án với rất nhiều thư mục / tập tin ẩn trong đó. Tôi muốn tạo một kho lưu trữ zip của nó, nhưng trong kho lưu trữ không nên có bất kỳ thư mục / tập tin ẩn nào. Nếu các tập tin trong một thư mục ẩn không bị ẩn, chúng cũng không nên được bao gồm.

Tôi biết rằng tôi có thể tạo một kho lưu trữ zip của một thư mục như thế này:

zip -r zipfile.zip directory

Tôi cũng biết rằng tôi có thể loại trừ các tệp với tùy chọn -x, vì vậy tôi nghĩ rằng điều này có thể hoạt động:

zip -r zipfile.zip directory -x .*

Nó không hoạt động. Tất cả các thư mục ẩn vẫn còn trong tệp zip.

Câu trả lời:


107

Điều này cũng loại trừ các tập tin ẩn trong các thư mục chưa được lưu:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@

2
Cảm ơn câu trả lời của bạn. Lệnh ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) dài hơn dự kiến, nhưng nó hoạt động tốt. Các thư mục con cũng được bao gồm, vì vậy +1 và câu trả lời được chấp nhận :-)
Martin Thoma

104

Trước hết, nếu bạn chưa cài đặt, hãy cài đặt zip trước như sau:

sudo apt-get install zip

Sau đó, chỉ đơn giản là tạo một tệp zip:

zip -r compressed_filename.zip foldername

Nếu bạn muốn loại trừ các tập tin ẩn:

find /folder_path -path '*/.*' -prune -o -type f -print | zip ~/compressed_filename.zip -@

Không bao gồm các tệp từ Lưu trữ Zip (lấy từ http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

Các vấn đề cơ bản về loại trừ tệp khi tạo tệp lưu trữ zip được tập trung xung quanh -xcờ, được sử dụng để loại trừ các tệp khỏi kho lưu trữ khớp với tên hoặc mẫu cụ thể. Ở mức cơ bản nhất, nó sẽ trông như thế này:

zip archive.zip files -x "ExcludeMe"

Có nghĩa là bạn có thể loại trừ một tệp duy nhất, giả sử nó có tên là N Nanksanks.jpg.

zip archive.zip images/ -x "Nothanks.jpg"

Chúng ta hãy bao gồm một vài ví dụ cụ thể trong đó điều này hữu ích.

Loại trừ các tệp .DS_Store khỏi Lưu trữ Zip

Điều này sẽ ngăn các .DS_Store tệp siêu dữ liệu Mac vô hình điển hình được đưa vào kho lưu trữ zip, được gói theo mặc định:

zip -r archivename.zip archivedirectory -x "*.DS_Store"

Tuy nhiên, nếu thư mục bao gồm các thư mục con, bạn cũng sẽ muốn sử dụng một biến thể khác của lệnh đó để loại trừ các tệp ds_store khỏi các thư mục con:

zip -r archive.zip directory -x "*/\.DS_Store"

Lưu ý: không phải tất cả các shell đều yêu cầu các trích dẫn để lệnh này hoạt động chính xác, nhưng trong bash shell (mặc định cho OS X), bạn sẽ cần sử dụng các trích dẫn để loại trừ với các ký tự đại diện và các mẫu.

Loại trừ các loại tệp cụ thể khỏi Lưu trữ Zip

Với các ký tự đại diện, bạn cũng có thể loại trừ tất cả các tệp thuộc một loại nhất định bằng cách tập trung vào tiện ích mở rộng. Ví dụ: lệnh này sẽ nén toàn bộ thư mục, trừ mọi .jpgtệp:

zip -r archive.zip directory -x "*.jpg"

Điều đó có thể được sửa đổi cho bất kỳ phần mở rộng tệp cụ thể hoặc mẫu phù hợp trong một tên tệp.

Loại trừ thư mục .git hoặc .svn khỏi Lưu trữ Zip

Zip một thư mục, trừ .gitvà nội dung của nó:

zip -r zipdir.zip directorytozip -x "*.git*"

Zip một thư mục, không bao gồm .svnthư mục:

zip -r zipped.zip directory -x "*.svn*"

Loại trừ tất cả các tệp ẩn khỏi Lưu trữ Zip

Vì các mẫu và ký tự đại diện có thể được sử dụng, bạn cũng có thể loại trừ bất kỳ hoặc tất cả các tệp và thư mục vô hình được tạo ra bằng cách được thêm tiền tố vào một khoảng thời gian, cho dù đó là một thư mục như .svnhoặc một tệp riêng lẻ như .bash_profilehoặc .htaccess.

zip -r archivename.zip directorytozip -x "*.*"

Hoặc để loại trừ tất cả các tệp vô hình khỏi tất cả các thư mục con:

zip -r archive.zip directory -x "*/\.*"

5
Cảm ơn bạn đã nỗ lực để giúp đỡ một người dùng Ubuntu. Xin lưu ý rằng việc nêu lại câu trả lời được chấp nhận trong một câu trả lời mới chỉ làm tăng thêm sự lộn xộn và có xác suất cao bị gắn cờ để xóa.
hmayag

54

Thêm "vào .*(nếu không, trình bao của bạn sẽ mở rộng .*sang các tệp chấm trong thư mục hiện tại) và cũng loại trừ các tệp ẩn trong thư mục con:

zip -r zipfile.zip . -x ".*" -x "*/.*"

Điều này sẽ dẫn đến các tệp bắt đầu bằng .không được thêm vào tệp zip của bạn.

rinzwind@discworld:~/tmp$ ls -la
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 tmp
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 .tmp
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x .*
adding: .tmp/ (stored 0%)
adding: tmp/ (stored 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
updating: tmp/ (stored 0%)

1
Tôi không nghĩ rằng tuyên bố cuối cùng của bạn là chính xác. .*sẽ được mở rộng bởi vỏ.
hammar

1
Tôi nghĩ rằng nó có thể đúng nhưng tôi đã xóa nó (không chắc chắn về điều đó) :)
Rinzwind

việc này không hiệu quả. Các thư mục .svn đã được thêm vào
Martin Thoma

1
@moose Mẫu loại trừ khớp với đường dẫn đầy đủ, không chỉ tên cơ sở của tệp, vì vậy bạn cần loại trừ */.*cũng như .*( */khớp với bất kỳ chuỗi thư mục không trống nào).
Gilles

Điều này chạy mà không thay đổi bất cứ điều gì! Câu trả lời hay nhất.
Whitecat

8

Cái này bao gồm tất cả "." thư mục, thư mục con và "." tệp hoặc thư mục trong thư mục ... Về cơ bản là câu trả lời đầu tiên nhưng bao gồm cấp cao nhất "." các tập tin.

find /full_path -path '*.*/.*' -prune -o -type f -print | zip ~/file.zip -@

8

Ví dụ để loại trừ tất cả các thư mục bắt đầu với. :

tar cvpzf folder.tgz folder/ --exclude '.*'

Nén tốt hơn nhưng chậm hơn:

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'

5

Phương pháp đúng sẽ là:

zip -r zipfile.zip directory -x directory/.*

@downvoter: Có gì sai, điều này dường như đang làm việc cho tôi.
việc

Vấn đề tương tự như với câu trả lời ban đầu của Rinzwind (hiện đã được sửa): bạn không loại trừ các thư mục con. Và như Rinzwind đã lưu ý, bạn cần trích dẫn các ký tự đại diện, nếu không thì shell sẽ mở rộng chúng.
Gilles

4

Trong khi nén các thư mục không bao gồm một số phần mở rộng tập tin:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"

3

Không có các thư mục và tập tin ẩn trong thư mục:

zip -r zipfile.zip directory/*

danh mục: |── .git │   ├── src │   └── Work.file ├── .test │   └── .file └── test.file

$ zip -r zipfile.zip directory/*
adding: directory/src/ (stored 0%)
adding: directory/src/Work.file (stored 0%)
adding: directory/test.file (stored 0%)
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.