Как мне создать отдельные zip-файлы для каждого выбранного файла / каталога в 7zip?
Это внутренний упаковщик zip от Total Commander:
Однако я хочу использовать мой упаковщик 7zip. Когда я выбираю 5 файлов, я получаю 5 отдельных ZIP-архивов для каждого выбранного файла. Как мне это сделать в 7zip?
3 ответа
Я не уверен, что вы можете делать то, что вы предлагаете, используя графический интерфейс пользователя, но вы, безусловно, можете из командной строки:
FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"
Вам нужно будет изменить каталог (cd
команда) к F:\Downloads
сначала каталог, или любой каталог, который вы хотите выполнить массовое сжатие. Кроме того, достаточно просто заменить *.exe или любое расширение, которое вы хотите отфильтровать, чтобы просто сжать эти документы.
И секретный декодер звонит:
%i
переменная, которая содержит имя файла для каждого шага в цикле(*.*)
это критерии выбора, это может быть просто *.exe или аналогичный7z.exe
версия командной строки 7-Zip%~ni
- это расширяет переменную%i только до имени файла - без расширения
Если вы хотите просто добавить папки для данного каталога, команда немного сложнее, поскольку по умолчанию FOR просто работает с файлами. Нам нужно предоставить ему дополнительную информацию:
FOR /F "usebackq delims=?" %i IN (`DIR /B /A:D`) DO 7z.exe a "%i.7z" "%i"
Это работает из-за нескольких частей того, что кажется магией:
/F
говорит FOR перебирать расширенное значение в ()usebackq
говорит FOR, что я собираюсь передать команду и использовать вывод для итерацииdelims=?
говорит ЗА, что я хочу разбить токены на?
- недопустимый символ в именах файлов и каталогов. Я хочу только один токен./B
вDIR
для голого формата - только название/A:D
вDIR
для ограничения результатов по атрибуту, D для каталогов
Если вы хотите инкапсулировать это внутри пакетного файла, единственное изменение, которое вам нужно будет сделать, это дважды экранировать переменную%i:
FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
Мне нравится ответ Гойюкс. Однако, если вы используете 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 }
Это будет включать только файлы, которые:
- иметь расширение CSV
- размером менее 18 900 байт
- последнее изменение 1 июля 2011 года или после этой даты
РЕДАКТИРОВАТЬ Если вы хотите zip-файлы вместо 7-zip-файлов, используйте вместо этого zip.exe InfoZip.
Я только что работал над именно этой проблемой, и одной из найденных проблем было дублирование имени папки в архиве, то есть при сжатии папки с именем "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", и запускаться от имени администратора из каталога, содержащего папки, которые вы хотите сжать.
Надеюсь это поможет.
Если вам нужно сохранить структуру папок и сохранить каждый файл в отдельной структуре, попробуйте следующее:
Сохраните эту команду в файле с расширением.bat и поместите его в папку, которую нужно заархивировать:
FOR /R %%i IN (*.*) DO "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" "%%i" -sdel
Заметка:
-sdel: удаляет исходный файл (необязательно, если вы хотите сохранить только сжатый файл)
Вы можете загрузить и установить плагин 7zip для Total Commander с http://www.ghisler.com/plugins.htm Как только вы сделаете это в правой части окна на скриншоте, появится еще один вариант сжатия 7zip. С помощью этой опции вы можете выполнить именно то, что вы просите.