Làm cách nào để tạo tệp .zip cho mỗi thư mục trong một thư mục khác?


16

Trong thư mục images\, tôi có các thư mục sau:

  • Usa\
  • Italy\
  • Japan\

Vân vân..

Tôi muốn có một kịch bản tạo ra một .zipcho mỗi người trong số các thư mục này, vì vậy tôi có usa.zip, italy.zip, japan.zip.

Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


9

Tôi giả sử đây là Windows, vì bạn đang sử dụng dấu gạch chéo ngược.

Nhận 7za.exe (phiên bản dòng lệnh của 7-zip ) và đặt nó vào của bạn %PATH%.

Sau đó chạy nó trong Images\thư mục của bạn :

for /f "tokens=* usebackq" %G in (`dir /b /a:d "%cd%"`) do 7za a -r -tzip "%~G.zip" "%~G"

Hoặc trong một tập lệnh bó:

for /f "tokens=* usebackq" %%G in (`dir /b /a:d "%cd%"`) do 7za a -r -tzip "%%~G.zip" "%%~G"

Điều này không hoạt động nếu các thư mục có khoảng trắng trong tên của chúng.
jiggunjer

@jiggunjer Vâng, bạn nói đúng. Tôi đã sửa nó để làm việc với khoảng trắng trong tên thư mục.
paradroid

1
Điều này hoạt động ngay cả với thực thi 7zip bình thường. Tôi đã cập nhật 7za thành "C: \ Program Files \ 7-Zip \ 7z.exe" và nó hoạt động mà không gặp vấn đề gì.
dùng1324161

7

Bạn có thể sử dụng Winrar cho việc này.

Chọn tất cả các thư mục của bạn, nhấp chuột phải và chọn Add to archive. Bây giờ chọn tùy chọn Put each file to separate archivetrong tab Files:

nhập mô tả hình ảnh ở đây

Nhấn OK và bạn đã hoàn thành. Nếu bạn muốn tệp .zip thay vì .rar, chỉ cần chọn ZIPtrong Generaltab bên dưới Archive format.


7

Giả sử bạn đang ở trên Linux, bạn có thể sử dụng tập lệnh Bash như thế này:

  #!/bin/bash

  IFS=$'\n'

  for f in $(find "$1" -mindepth 1 -maxdepth 1 -type d ); do
    zip -r "$f" "$f"
  done

Kịch bản này sẽ lấy đối số đầu tiên làm thư mục, trong trường hợp này là hình ảnh và lặp lại chính xác một cấp độ sâu để có được tất cả các thư mục của bạn (Hoa Kỳ, Ý và Nhật Bản) và nén chúng ở cùng một vị trí.

Nó sẽ không xóa các tệp zip cũ hoặc các thư mục nguồn. Zip đủ thông minh để phát hiện các tệp zip hiện có và cập nhật chúng khi chạy lại. Tuy nhiên, nếu bạn xóa một tệp trong các thư mục nguồn thì nó sẽ không bị xóa trong các tệp zip. Bạn có thể tránh hành vi này bằng cách xóa các tệp hiện có trước đó.


Tôi đã sử dụng tập lệnh Linux mà sponiro đã đăng và thêm một dòng ở đầu để xóa các thư mục: find $ 1 -type d | xargs rm -rf
genevish

0

Câu trả lời này của MvG đã làm việc cho tôi trên Ubuntu:

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 zip và bạn sẽ thấy các lệnh được in thay vì được thực thi.

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.