Como crio arquivos zip separados para cada arquivo / diretório selecionado no 7zip?

30

Este é o empacotador de zip interno do Total Commander:

Uma imagem da caixa de diálogo do empacotador de zip do Total Commander.

No entanto, eu quero usar meu empacotador 7zip. Quando seleciono 5 arquivos, recebo 5 arquivos .zip separados para cada arquivo selecionado. Como faço isso no 7zip?

Urso mal-humorado
fonte

Respostas:

54

Não tenho certeza de que você pode fazer o que está sugerindo usando a interface gráfica do usuário, mas certamente pode fazê-lo na linha de comando:

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

Você precisaria alterar o diretório (o cdcomando) para o F:\Downloadsdiretório primeiro ou qualquer diretório que desejasse executar a compactação em massa. Além disso, é fácil substituir o arquivo * .exe ou qualquer extensão que você deseja filtrar para compactar apenas esses documentos.

E o anel decodificador secreto:

  • %i é uma variável que contém o nome do arquivo para cada etapa do loop
  • (*.*) é o critério de seleção, ele pode ser facilmente * .exe ou similar
  • 7z.exe é a versão da linha de comandos do 7-Zip
  • %~ni - isso expande a variável% i para apenas o nome do arquivo - sem extensão

Se você deseja apenas adicionar as pastas para um determinado diretório, o comando é um pouco mais complexo, pois, por padrão, o FOR apenas funciona com arquivos. Precisamos fornecer algumas informações adicionais:

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

Isso funciona por causa de algumas peças do que parece mágica:

  • /F diz FOR para iterar sobre o valor expandido em ()
  • usebackq diz FOR que eu vou passar um comando e usar a saída para iterar
  • delims=?diz a FOR que eu quero dividir os tokens no ?- um caractere ilegal nos nomes e diretórios dos arquivos. Eu só quero um token.
  • O /Bin DIRé para formato simples - apenas o nome
  • O /A:Din DIRé para restringir os resultados por atributo, o D é para diretórios

Se você quiser encapsular isso dentro de um arquivo em lotes, a única alteração que você precisará fazer é escapar duas vezes da variável% i:

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
Goyuix
fonte
Sim, exceto o seu é um arquivo 7z, eu quero um arquivo zip! Então% ~ ni.zip?
Grumpy ol 'Bear
Melhor ainda, quero zip ou 7z com ultra compactação. E coloque-o em d: \ compactado. Mas até agora seu método funciona!
Grumpy ol 'Bear
1
Entendi, obrigado! PARA% i IN ( . ) DO 7z.exe e "i: \ compactado \% ~ ni.7z" "% i" -mx9
Grumpy ol 'Bear
A propósito, você pode me mostrar como fazer isso em um arquivo em lotes? sperate-archive.bat
Grumpy ol 'Bear
Obrigado, e como adiciono pastas inteiras a esse script, por favor?
Grumpy ol 'Bear
15

Eu gosto da resposta de Goyuix. No entanto, se você estiver usando o Windows 7 (ou o Power Shell estiver instalado) e também usar a versão da linha de comando do 7-zip, 7za.exe, poderá executar este comando:

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

Você também pode alterar "dir" para "dir * .exe" para selecionar apenas arquivos executáveis.

Uma coisa legal do Power Shell é que você está trabalhando com objetos em vez de strings. Então você pode ser realmente específico se quiser. Por exemplo:

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

Isso incluirá apenas arquivos que:

  1. tem uma extensão csv
  2. menos de 18.900 bytes de tamanho
  3. modificado pela última vez em 1/7/2011

EDIT Se você quiser arquivos zip em vez de arquivos 7-zip, use o zip.exe do InfoZip .

jftuga
fonte
4
O 7-zip também pode criar arquivos zip - dê uma olhada no sinalizador -t. Exemplo:7z a -tzip archive.zip *.exe
Goyuix
Ok, $ _. BaseName $ _. Name funciona, mas como faço para $ _. BaseName $ _. Name em outra unidade, em outro diretório? Diga f: \ test \ file1.7z etc.
Grumpy ol 'Bear
0

Você pode fazer o download e instalar o plug-in 7zip para o Total Commander em http://www.ghisler.com/plugins.htm Depois de fazer isso no lado direito da janela a partir da captura de tela, haverá outra seleção para a compactação 7zip. Com essa opção, você pode realizar exatamente o que está solicitando.

Mxx
fonte
0

Acabei de trabalhar exatamente nesse problema e um dos problemas que encontrei foi a duplicação do nome da pasta no arquivo, ou seja, ao compactar uma pasta chamada "foo", um arquivo contendo .\foo\fighters.txté produzido em vez de apenas um contendo fighters.txt.

A resposta, portanto, é ir para o diretório que está sendo processado e fazer com que o arquivo apareça no diretório (raiz) anterior, depois retorne ao diretório para processar a próxima pasta.

Também é importante que o 7ZIP ignore os arquivos ZIP e CMD existentes no diretório raiz para evitar que eles acabem no arquivo morto, daí os argumentos de exclusão -x!*.zipe -x!*.cmd.

Este script também manterá estruturas de pastas recursivas.

@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

O código acima deve ser copiado para um arquivo em lotes como "compress_dirs.cmd" e executado como admin a partir do diretório que contém as pastas que você deseja compactar.

Espero que isto ajude.

Pi Hard
fonte
0

Se você precisar manter a estrutura de pastas e salvar cada arquivo em sua própria estrutura, tente o seguinte:

Salve este comando em um arquivo com a extensão .bat e coloque-o na pasta que você precisa zipar:

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

Nota:

-sdel: exclui o arquivo original (opcional, se você deseja apenas manter o arquivo compactado)

amor ao vivo
fonte