Este é o empacotador de zip interno 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?
Este é o empacotador de zip interno 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?
Respostas:
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 cd
comando) para o F:\Downloads
diretó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 similar7z.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ãoSe 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 iterardelims=?
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./B
in DIR
é para formato simples - apenas o nome/A:D
in DIR
é para restringir os resultados por atributo, o D é para diretóriosSe 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"
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:
EDIT Se você quiser arquivos zip em vez de arquivos 7-zip, use o zip.exe do InfoZip .
7z a -tzip archive.zip *.exe
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.
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!*.zip
e -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.
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)