lệnh để nén nhiều thư mục vào các tệp zip riêng lẻ


40

Tôi có một thư mục chứa hàng tá thư mục bên trong nó.

Tôi mới sử dụng dòng lệnh và tôi đang vật lộn để đưa ra một lệnh sẽ nén từng thư mục con thành một tệp sub-directory.zip duy nhất.

Vì vậy, cuối cùng thư mục chính của tôi sẽ được lấp đầy với tất cả các thư mục con ban đầu của tôi, cộng với các .ziptệp tương ứng có chứa nội dung được nén của mỗi thư mục con.

Có phải bất cư thứ gì như thế này đều được? Nếu vậy, xin vui lòng chỉ cho tôi làm thế nào nó được thực hiện.


Tôi đề nghị bạn tìm kiếm cách "vòng lặp" có thể được thực hiện trong trình bao. Có những onliners có thể làm những gì bạn muốn, nhưng một vòng lặp tốt đẹp sẽ rõ ràng hơn nhiều.
lynxlynxlynx

Vì vậy, điều đó có nghĩa là tôi cần phải viết một tập lệnh shell riêng biệt, và sau đó gọi tập lệnh đó từ dòng lệnh? Xin lỗi cho một câu hỏi cơ bản như vậy. Mặc dù tôi có một số kinh nghiệm lập trình nhưng công cụ này là mới đối với tôi.
Evster

Câu trả lời:


75

Bạn có thể sử dụng vòng lặp này trong bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

ilà tên của biến vòng lặp. */có nghĩa là mọi thư mục con của thư mục hiện tại và sẽ bao gồm một dấu gạch chéo trong các tên đó. Hãy chắc chắn rằng bạn cdđến đúng nơi trước khi thực hiện điều này. "$i"chỉ cần đặt tên thư mục đó, bao gồm dấu gạch chéo. Dấu ngoặc kép đảm bảo rằng khoảng trắng trong tên thư mục sẽ không gây rắc rối. ${i%/}giống như $inhưng với dấu gạch chéo được loại bỏ, vì vậy bạn có thể sử dụng nó để xây dựng tên của tệp zip.

Nếu bạn muốn xem cách thức hoạt động của nó, hãy bao gồm echotrước zipvà bạn sẽ thấy các lệnh được in thay vì được thực thi.


Cảm ơn điều này có vẻ tuyệt vời! Tuy nhiên, một vấn đề tiềm năng tôi nghĩ đến: liệu zip này có TẤT CẢ các thư mục trong mỗi thư mục con thành các tệp riêng biệt không? Tôi chỉ muốn nén các thư mục con cấp 1 dưới dạng các tệp nén đơn. Tôi không muốn tạo các tệp zip bổ sung cho các thư mục con cấp 2, cấp 3, v.v ... Xin vui lòng cho tôi biết nếu điều đó có ý nghĩa. Cảm ơn một lần nữa!
Evster

Chỉ những người cấp đầu tiên như bạn yêu cầu.
lynxlynxlynx

Các */tên mỗi thư mục con trực tiếp, không phải mọi thư mục hậu duệ. Vì vậy, bạn sẽ chỉ nhận được các khóa cho cấp cao nhất, theo cách bạn muốn. Phiên bản với echonó sẽ chứng minh khía cạnh đó. Việc nén mọi thư mục lồng nhau vào tập tin riêng của nó trong thực tế sẽ có nhiều công việc hơn và có thể được giải quyết tốt nhất bằng cách sử dụng find -type dcác thủ thuật khác.
MvG

1
@fritzmg: Một thử nghiệm cục bộ trên Linux của tôi cho thấy rằng có, các tệp bắt đầu bằng dấu chấm được bao gồm. Đây sẽ là một thuộc tính của công cụ Info-ZIP, không phải của lệnh tôi đã đưa ra, do đó tùy thuộc vào zipnhị phân của bạn là gì, bạn có thể có hành vi khác nhau. Để tạo các tệp zip cho các thư mục cấp cao nhất (tức là con của thư mục hiện tại) bắt đầu bằng dấu chấm, bạn cũng có thể sử dụng shopt -s dotglobđể tạo các mẫu hình cầu khớp với các tệp ẩn.
MvG

1
Để tạo một zip không có thư mục gốc làm gốc:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
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.