Làm cách nào để tạo các tệp zip riêng cho mỗi tệp / thư mục được chọn trong 7zip?


30

Đây là trình đóng gói zip nội bộ từ Total Commander:

Một hình ảnh của hộp thoại Total Commander zip packer.

Tuy nhiên tôi muốn sử dụng trình đóng gói 7zip của mình. Khi tôi chọn 5 tệp, tôi nhận được 5 tệp lưu trữ .zip riêng cho mỗi tệp đã chọn. Làm thế nào để tôi làm điều đó trong 7zip?

Câu trả lời:


54

Tôi không chắc bạn có thể làm những gì bạn đang đề xuất bằng giao diện người dùng đồ họa, nhưng bạn chắc chắn có thể từ dòng lệnh:

FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"

Bạn sẽ cần thay đổi thư mục ( cdlệnh) thành F:\Downloadsthư mục trước hoặc bất kỳ thư mục nào bạn muốn thực hiện nén hàng loạt. Ngoài ra, thật dễ dàng để thay thế trong * .exe hoặc bất kỳ tiện ích mở rộng nào bạn muốn lọc để chỉ nén các tài liệu đó.

Và vòng giải mã bí mật:

  • %i là một biến chứa tên tệp cho mỗi bước trong vòng lặp
  • (*.*) là tiêu chí lựa chọn, nó có thể dễ dàng là * .exe hoặc tương tự
  • 7z.exe là phiên bản dòng lệnh của 7-Zip
  • %~ni - điều này mở rộng biến% i thành tên tệp - không có phần mở rộng

Nếu bạn muốn chỉ thêm các thư mục cho một thư mục nhất định, lệnh sẽ phức tạp hơn một chút vì theo mặc định FOR chỉ hoạt động với các tệp. Chúng tôi cần cung cấp cho nó một số thông tin bổ sung:

FOR /F "usebackq delims=?" %i IN (`DIR /B /A:D`) DO 7z.exe a "%i.7z" "%i"

Điều này hoạt động vì một vài phần giống như phép thuật:

  • /F nói với FOR để lặp lại giá trị mở rộng trong ()
  • usebackq nói với FOR rằng tôi sẽ truyền lệnh và sử dụng đầu ra để lặp
  • delims=?nói với FOR rằng tôi muốn tách token trên ?- một ký tự không hợp lệ trong tên tệp và thư mục. Tôi chỉ muốn một mã thông báo.
  • Các /Bin DIRđịnh dạng trần - chỉ tên
  • Cái /A:Dtrong DIRlà để hạn chế kết quả theo thuộc tính, D là dành cho thư mục

Nếu bạn muốn gói gọn điều này bên trong một tệp bó, thay đổi duy nhất bạn cần thực hiện là thoát gấp đôi biến% i:

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"

Vâng, ngoại trừ của bạn là lưu trữ 7z, tôi muốn một kho lưu trữ zip! Vậy% ~ ni.zip thay thế?
Gấu Grumpy ol '

Tốt hơn nữa, tôi muốn zip hoặc 7z với siêu nén. VÀ đóng gói trong d: \ pack. Nhưng cho đến nay phương pháp của bạn hoạt động!
Gấu Grumpy ol '

1
Hiểu rồi, cảm ơn bạn! (CHO% i TRÊN . ) DO 7z.exe một "i: \ đóng gói \% ~ ni.7z" "% i" -mx9
Grumpy ol' Gấu

Nhân tiện, bạn có thể chỉ cho tôi cách làm điều đó trong một tệp bó không? tức là sperator-archive.bat
Grumpy ol 'Bear

Cảm ơn, và làm cách nào để thêm toàn bộ thư mục vào tập lệnh đó?
Gấu Grumpy ol '

15

Tôi thích câu trả lời của Goyuix. Tuy nhiên, nếu bạn đang sử dụng Windows 7 (hoặc đã cài đặt Power Shell) và cũng sử dụng phiên bản dòng lệnh của 7-zip, 7za.exe, thì bạn có thể chạy lệnh này:

dir | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

Bạn cũng có thể thay đổi "dir" thành "dir * .exe" để chỉ chọn các tệp thực thi.

Một điều thú vị về Power Shell là bạn đang làm việc với các đối tượng thay vì chuỗi. Vì vậy, bạn có thể nhận được thực sự cụ thể nếu bạn muốn. Ví dụ:

dir *.csv | ? { $_.Length -lt 18900 -and $_.LastWriteTime -ge [DateTime] "07/01/2011" } | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

Điều này sẽ chỉ bao gồm các tệp:

  1. có phần mở rộng csv
  2. kích thước nhỏ hơn 18.900 byte
  3. sửa đổi lần cuối vào hoặc sau ngày 7/1/2011

EDIT Nếu bạn muốn các tệp zip thay vì các tệp 7-zip, thay vào đó hãy sử dụng zip.exe của InfoZip .


4
7-zip cũng có thể tạo các tệp zip - hãy xem cờ -t. Ví dụ:7z a -tzip archive.zip *.exe
Goyuix

Ok, $ _. BaseName $ _. Tên hoạt động, nhưng làm thế nào để tôi làm $ _. BaseName $ _. Tên trên một ổ đĩa khác, trong một thư mục khác? Nói f: \ test \ file1.7z, v.v.
Grumpy ol 'Bear

0

Bạn có thể tải xuống và cài đặt plugin 7zip cho Total Commander từ http://www.ghisler.com/plugins.htm Một khi bạn làm điều đó ở phía bên phải của cửa sổ từ ảnh chụp màn hình của bạn, sẽ có một lựa chọn khác để nén 7zip. Với tùy chọn đó, bạn có thể thực hiện chính xác những gì bạn đang yêu cầu.


0

Tôi vừa mới giải quyết chính xác vấn đề này và một trong những vấn đề tôi tìm thấy là sự trùng lặp tên thư mục trong kho lưu trữ, tức là khi nén một thư mục có tên "foo", một tệp lưu trữ chứa .\foo\fighters.txtđược tạo ra thay vì chỉ chứa một tệp fighters.txt.

Do đó, câu trả lời là đi vào thư mục đang được xử lý và lưu trữ xuất hiện trong thư mục (gốc) trước đó, sau đó quay lại thư mục đó để xử lý thư mục tiếp theo.

Điều quan trọng nữa là có 7ZIP bỏ qua các tệp ZIP và CMD hiện có trong thư mục gốc để ngăn chặn chúng kết thúc trong kho lưu trữ, do đó các đối số loại trừ -x!*.zip-x!*.cmdloại trừ.

Kịch bản này cũng sẽ duy trì cấu trúc thư mục đệ quy.

@echo off

REM Ensures variables set within the batch file are local to
REM this script only and will be removed when finished.
setlocal

if exist *.zip goto zip_exist

for /d %%X in (*) do (
    cls
    cd /D %%X
    "e:\Program Files\7-Zip\7z.exe" a -r  -x!*.zip -x!*.cmd "..\%%X.zip" "*.*"
    cd ..
)
goto end

:zip_exist
Echo.
Echo Note: for this script to work, compression of
Echo pre-existing zip files is not possible.

:end
pause

Mã trên phải được sao chép vào một tệp bó, chẳng hạn như "compression_dirs.cmd" và chạy với tư cách quản trị viên từ thư mục chứa các thư mục bạn muốn nén.

Hi vọng điêu nay co ich.


0

Nếu bạn cần giữ cấu trúc thư mục và lưu từng tệp trong cấu trúc riêng của mình, hãy thử điều này:

Lưu lệnh này trong một tệp có đuôi .bat và đặt nó vào thư mục bạn cần nén:

FOR /R %%i IN (*.*) DO "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" "%%i" -sdel

Chú thích:

-sdel: Xóa tệp gốc (tùy chọn, nếu bạn chỉ muốn giữ tệp nén)

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.