Як створити окремі ZIP-файли для кожного вибраного файла / каталогу в 7zip?


30

Це внутрішній пакувач-поштовий індекс від Total Commander:

Зображення діалогового вікна пакунка ZIP-пакету Total Commander.

Однак я хочу використовувати мій пакувач 7zip. Коли я вибираю 5 файлів, я отримую 5 окремих архівів .zip для кожного вибраного файлу. Як це зробити в 7zip?

Відповіді:


54

Я не впевнений, що ви можете робити те, що пропонуєте, використовуючи графічний інтерфейс користувача, але ви можете, звичайно, з командного рядка:

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

Вам потрібно спочатку змінити каталог ( cdкоманду) на F:\Downloadsкаталог або будь-який каталог, який ви хочете виконати масовим стисненням. Крім того, досить просто замінити * .exe або будь-яке розширення, яке ви хочете відфільтрувати, щоб просто стиснути ці документи.

І секретне кільце декодера:

  • %i - змінна, яка містить ім'я файлу для кожного кроку в циклі
  • (*.*) є критеріями вибору, це може бути * .exe або подібним
  • 7z.exe - версія командного рядка 7-Zip
  • %~ni - це змінює змінну% i лише на ім'я файлу - без розширення

Якщо ви хотіли просто додати папки для заданого каталогу, команда є трохи складнішою, оскільки за замовчуванням ЗА просто працює з файлами. Нам потрібно подати йому додаткову інформацію:

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

Це працює через кілька фрагментів того, що здається магічним:

  • /F повідомляє FOR для повторення розширеного значення в ()
  • usebackq говорить ЗА, що я збираюся передати команду і використовувати висновок для ітерації
  • delims=?ДЛЯ, що я хочу розбити лексеми на ?- незаконний символ у назвах файлів та каталогів. Я хочу лише один жетон.
  • /BУ DIRдля голого формату - тільки ім'я
  • /A:DУ DIRдля обмеження результатів по атрибуту, то D для каталогів

Якщо ви хочете інкапсулювати це всередині пакетного файлу, єдине зміна, яке вам потрібно буде внести, це подвійне вимкнення змінної% i:

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

Так, крім вашого 7z архіву, я хочу поштовий архів! Так замість цього% ~ ni.zip?
Grumpy ol 'Bear

А ще краще, я хочу блискавку або 7z з ультра-стисненням. І упакуйте його в d: \ упаковано. Але поки ваш метод працює!
Grumpy ol 'Bear

1
Зрозумів, дякую! ДЛЯ% i IN ( . ) DO 7z.exe a "i: \ packed \% ~ ni.7z" "% i" -mx9
Grumpy ol 'Bear

До речі, чи можете ви показати мені, як це зробити в пакетному файлі? тобто sperate-archive.bat
Grumpy ol 'Bear

Дякую, і як я можу додати ці папки до цього сценарію?
Grumpy ol 'Bear

15

Мені подобається відповідь Гоюї. Однак якщо ви використовуєте Windows 7 (або встановлено Power Shell), а також використовуєте версію командного рядка 7-zip, 7za.exe, тоді ви можете запустити цю команду:

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

Ви також можете змінити "dir" на "dir * .exe", щоб вибрати лише виконувані файли.

Одна приємна річ про Power Shell - це те, що ви працюєте з об’єктами замість рядків. Таким чином, ви могли б отримати дійсно конкретні, якщо хочете. Наприклад:

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

Сюди входять лише файли, які:

  1. мають розширення csv
  2. розміром менше 18 900 байт
  3. востаннє змінено 01.07.2011 або пізніше

РЕДАКТУВАННЯ Якщо ви хочете поштові файли замість 7-zip-файлів, використовуйте замість zip.exe InfoZip .


4
7-zip також може створювати поштові файли - подивіться прапор -t. Приклад:7z a -tzip archive.zip *.exe
Goyuix

Добре, $ _. BaseName $ _. Ім'я працює, але як мені зробити $ _. BaseName $ _. Ім'я на іншому диску, в іншому каталозі? Скажіть f: \ test \ file1.7z і т. Д.
ol 'Ведмідь

0

Ви можете завантажити та встановити плагін 7zip для Total Commander з http://www.ghisler.com/plugins.htm Після того, як ви це зробите в правій частині вікна зі свого екрана екрана, з'явиться ще один вибір для стиснення 7zip. За допомогою цього варіанту ви можете виконати саме те, про що ви просите.


0

Я тільки працював над саме цією проблемою, і одне з виявлених нами проблем - це дублювання імені папки в архіві, тобто при стисненні папки під назвою "foo" створюється архів, що містить .\foo\fighters.txtзамість того, щоб містити лише одну fighters.txt.

Відповідь, таким чином, полягає в тому, щоб зайти в оброблюваний каталог і відобразити архів у попередньому (кореневому) каталозі, а потім повернутися до цього каталогу для обробки наступної папки.

Також важливо, щоб 7ZIP ігнорував існуючі файли ZIP та CMD у кореневому каталозі, щоб запобігти їх закінченню в архіві, отже, -x!*.zipі -x!*.cmdаргументи виключення.

Цей сценарій також підтримуватиме рекурсивні структури папок.

@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

Вищевказаний код слід скопіювати у пакетний файл, такий як "compress_dirs.cmd" і запустити як адміністратор із каталогу, що містить папки, які ви хочете стиснути.

Сподіваюся, це допомагає.


0

Якщо вам потрібно зберегти структуру папок і зберегти кожен файл у своїй структурі, спробуйте це:

Збережіть цю команду у файлі з розширенням .bat і помістіть її в папку, яку потрібно зібрати:

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

Примітка:

-sdel: видаляє вихідний файл (необов'язково, якщо ви хочете зберегти лише стислий файл)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.