Thư mục zip Unix nhưng loại trừ các thư mục con cụ thể (và mọi thứ trong đó)


108

Tôi đang cố gắng nén một thư mục (trên Unix thông qua SSH) nhưng tôi cần loại trừ một vài thư mục con (và tất cả các tệp và thư mục trong chúng).

Cho đến nay tôi có điều này:

zip -r myarchive.zip dir1 -x dir1/ignoreDir/**/* 

Điều đó dường như không hoạt động mặc dù.

Tôi cũng đã thử

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/* dir1/ignoreDir2/*

Tuy nhiên, điều đó vẫn sẽ bao gồm các thư mục con trong ignDir1 và ignDir2.

Cấu trúc thư mục con trong các thư mục mà tôi muốn loại trừ là khá đáng kể vì vậy tôi không thể chỉ cần thêm từng thư mục vào đối số -x.

Có ai biết cách để làm điều này không?


@AlexanderMills - Xem câu hỏi này.
jww

Câu trả lời:


125

Tôi đã ở rất gần!

Lệnh thực tế tôi cần là:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*

Thật tuyệt, và cảm ơn đã theo dõi! Bằng cách này, bạn có thể chấp nhận câu trả lời của riêng bạn.
Daniel H

2
Điều này đã không làm việc cho tôi trên osx. @pathfilder trả lời đã làm.
rynop

11
Thay vì điều này: -x dir1 / ignDir1 / ** \ *, bạn có thể làm điều này: -x dir1 / ignDir1 / \ *
Richard Gomes

64

Đối với hệ thống cụ thể của tôi để loại trừ một thư mục, tôi phải đặt dấu ngoặc kép quanh các thư mục bị loại trừ của mình và nó hoạt động như một cơ duyên:

zip -r myarchive.zip dir1 -x "dir1/ignoreDir1/*" "dir1/ignoreDir2/*"

Ghi chú:

- điều này loại trừ cả thư mục để loại trừ và tất cả các tệp bên trong nó.

- Bạn phải sử dụng đường dẫn đầy đủ đến các thư mục bạn muốn loại trừ!


5
Đây là một trong những hoạt động trên Mac OS. :-)
vật lý

9
Vì không ai giải thích lý do yêu cầu trích dẫn đường dẫn hoặc thoát dấu hoa thị, lý do là: Nếu đường dẫn không được trích dẫn hoặc ký tự đại diện thoát, trình bao sẽ thực hiện mở rộng ký tự đại diện trước khi chuyển chúng sang zip, sẽ nhận được danh sách đường dẫn đến các mục trong các thư mục được chỉ định, nhưng không phải là đường dẫn đến các tệp trong thư mục con của các thư mục đó, do đó zipkhông thể bỏ qua mọi thứ trong các thư mục đã cho.
zagrimsan

Tôi nghĩ ban đầu một trong những lý do điều này hoạt động là vì trên Mac OS có không gian trong các thư mục của tôi và điều này tránh được việc cần một \
tìm đường dẫn

Cảm ơn bạn đã dọn dẹp mọi thứ @zagrimsan. Điều đó vừa khắc phục vấn đề vừa giải thích lý do cho nó để chúng tôi hiểu nó (điều này cũng sẽ có ích trong tương lai cho những thứ khác). 👍
Synetech

7

Sau đây sẽ làm

zip -r myarchive.zip dir1 -x dir1 / ignDir1 \ * dir1 / ignDir2 \ *

Bạn cần gì **cho, @sulman?

Nó hoạt động như một cơ duyên đối với tôi như sau:

[root@ip-00-000-000-000 dir1]# ls -lrt dir1/ 
total 16
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir1
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir2
drwxr-xr-x 2 root root 4096 Oct 31 07:39 dir3
-rw-r--r-- 1 root root    8 Oct 31 07:39 test.txt

[root@ip-00-000-000-000 temp]# zip -r dir1.zip dir1 -x dir1/ignoredir1\* dir1/ignoredir2\*
  adding: dir1/ (stored 0%)
  adding: dir1/dir3/ (stored 0%)
  adding: dir1/dir3/test3.txt (deflated 13%)
  adding: dir1/test.txt (stored 0%)

Tôi không biết tại sao ** là cần thiết. Có lẽ ai đó có thể làm sáng tỏ điều này?
sulman

Xin lỗi, @sulman, tôi đã gõ sai. Những gì tôi có nghĩa là theo chỉnh sửa mới nhất của tôi. Làm việc như một cơ duyên đối với tôi :)
ericn

7

@sulman sử dụng:

     zip -r myarchive.zip dir1 -x dir1 / ignDir1 / ** \ * dir1 / ignDir2 / ** \ *

vẫn sẽ bao gồm thư mục dir1 / ignDir1 / trống trong kho lưu trữ zip, sử dụng:

     zip -r myarchive.zip dir1 -x dir1 / ignDir1 ** dir1 / ignDir2 **

sẽ thực hiện thủ thuật, bạn cũng có thể sử dụng ** hàng đầu để tìm kiếm trong các thư mục con thay vì chỉ dir1


À được rồi! Cảm ơn đã làm sáng tỏ điều này!
sulman

1

Cũng giống như các câu trả lời khác, nhưng loại trừ hoàn toàn các thư mục, thay vì loại trừ tất cả nội dung của các thư mục:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*

0

Tôi thấy điều này để làm việc từ David R Heffelfinger :

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1\ignorDir2\*

Nó loại trừ thư mục và nội dung của nó.


Chắc chắn dấu gạch chéo ngược giữa dir1ignorDir2có nghĩa là một dấu gạch chéo về phía trước. Bạn có nghĩa là các dấu gạch chéo ngược khác là dấu gạch chéo ngược? Nếu bạn làm như vậy, thì bạn vừa sao chép câu trả lời của fuzzybee từ hai năm trước.
G-Man

-1

Đối với tôi đã làm việc: zip -9 -r ~ / Fold.zip trực tuyến -x thư mục / thư mục2 / thư mục3 / Foldern / \ * .

Có vẻ là dấu hoa thị phải được thoát.


2
Làm thế nào điều này khác với giải pháp của Rick Ehrahrt một năm trước, hoặc của Eric (một vài năm trước)? Vui lòng đọc các giải pháp được cung cấp trước khi đăng một cái mới ...
zagrimsan

Bởi vì tôi đã thêm dấu gạch chéo ngược trước dấu hoa thị (nghĩa là thoát dấu hoa thị). Trong phiên bản linux, công việc của tôi không hoạt động nếu tôi không làm điều đó.
Francisco M

Ngoài ra Rick Ehrahrt (2014) và eric (2012) đã đăng cùng một giải pháp (để thoát khỏi dấu hoa thị). Không có gì sai với giải pháp, nhưng việc đăng cùng một lần nhiều lần sẽ không có ý nghĩa trừ khi người ta có thể thêm đáng kể chiều sâu vào giải pháp bằng cách giải thích lý do tại sao giải pháp hoạt động. Trong một trường hợp đơn giản như thế này, không có gì để giải thích thêm. Xin đừng cá nhân, ý định duy nhất của tôi ở đây là giúp giữ SU sạch sẽ và súc tích để người dùng có thể tìm ra giải pháp tốt nhất với ít nỗ lực nhất.
zagrimsan
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.