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 .zip
cho 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 đó?
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 .zip
cho 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:
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"
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 archive
trong tab Files
:
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 ZIP
trong General
tab bên dưới Archive format
.
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 đó.
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
i
là 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ạncd
đế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ư$i
như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
echo
trướczip
và bạn sẽ thấy các lệnh được in thay vì được thực thi.