¿Cómo creo archivos zip separados para cada archivo / directorio seleccionado en 7zip?

31

Este es el zip packer interno de Total Commander:

Una imagen del cuadro de diálogo de Total Commander zip packer.

Sin embargo, quiero usar mi 7zip Packer. Cuando selecciono 5 archivos, obtengo 5 archivos .zip separados para cada archivo seleccionado. ¿Cómo hago eso en 7zip?

Oso gruñón
fuente

Respuestas:

54

No estoy seguro de que pueda hacer lo que sugiere mediante la interfaz gráfica de usuario, pero ciertamente puede hacerlo desde la línea de comandos:

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

Debería cambiar primero el directorio (el cdcomando) al F:\Downloadsdirectorio, o cualquier directorio en el que desee realizar la compresión masiva. Además, es bastante fácil sustituir * .exe o cualquier extensión que desee filtrar para comprimir esos documentos.

Y el anillo decodificador secreto:

  • %i es una variable que contiene el nombre del archivo para cada paso del bucle
  • (*.*) es el criterio de selección, podría ser fácilmente * .exe o similar
  • 7z.exe es la versión de línea de comando de 7-Zip
  • %~ni - esto expande la variable% i solo al nombre del archivo - sin extensión

Si solo desea agregar las carpetas para un directorio dado, el comando es un poco más complejo ya que por defecto FOR solo funciona con archivos. Necesitamos darle información adicional:

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

Esto funciona debido a algunas piezas de lo que parece magia:

  • /F le dice a FOR que repita el valor expandido en ()
  • usebackq le dice a FOR que voy a pasar un comando y usar la salida para iterar
  • delims=?le dice a FOR que quiero separar los tokens en el ?- un carácter ilegal en los nombres de archivos y directorios. Solo quiero una ficha.
  • El /Bde DIRes de formato desnudo - sólo el nombre
  • El /A:Dde DIRes para restringir los resultados por atributo, el D es para los directorios

Si desea encapsular esto dentro de un archivo por lotes, el único cambio que tendrá que hacer es escapar dos veces de la variable% i:

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
Goyuix
fuente
Sí, excepto que el tuyo es un archivo 7z, ¡quiero un archivo zip! Entonces, ¿% ~ ni.zip en su lugar?
Oso gruñón el
Mejor aún, quiero zip o 7z con ultra compresión. Y empacarlo en d: \ empacado. ¡Pero hasta ahora tu método funciona!
Oso gruñón el
1
¡Lo tengo. Gracias! PARA% i IN ( . ) DO 7z.exe a "i: \ empaquetado \% ~ ni.7z" "% i" -mx9
Oso gruñón el
Por cierto, ¿puedes mostrarme cómo hacerlo en un archivo por lotes? ie sperate-archive.bat
Grumpy ol 'Bear
Gracias, y ¿cómo agrego carpetas completas a ese script, por favor?
Oso gruñón el
16

Me gusta la respuesta de Goyuix. Sin embargo, si está utilizando Windows 7 (o tiene instalado Power Shell) y también utiliza la versión de línea de comandos de 7-zip, 7za.exe, puede ejecutar este comando:

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

También puede cambiar "dir" a "dir * .exe" para seleccionar solo archivos ejecutables.

Una cosa buena de Power Shell es que está trabajando con objetos en lugar de cadenas. Así que podrías ser realmente específico si quisieras. Por ejemplo:

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

Esto solo incluirá archivos que:

  1. tener una extensión csv
  2. menos de 18,900 bytes de tamaño
  3. última modificación a partir del 7/1/2011

EDITAR Si desea archivos zip en lugar de archivos 7-zip, use zip.exe de InfoZip en su lugar.

jftuga
fuente
44
7-zip también puede crear archivos zip: eche un vistazo a la bandera -t. Ejemplo:7z a -tzip archive.zip *.exe
Goyuix
Ok, $ _. BaseName $ _. Name funciona, pero ¿cómo hago $ _. BaseName $ _. Name en otra unidad, en otro directorio? Di f: \ test \ file1.7z etc.
Grumpy ol 'Bear
0

Puede descargar e instalar el complemento 7zip para Total Commander desde http://www.ghisler.com/plugins.htm Una vez que lo haga en el lado derecho de la ventana desde su captura de pantalla, habrá otra selección para la compresión 7zip. Con esa opción, puede lograr exactamente lo que está pidiendo.

Mxx
fuente
0

Acabo de estar trabajando exactamente en este problema y uno de los problemas que encontré fue la duplicación del nombre de la carpeta dentro del archivo, es decir, al comprimir una carpeta llamada "foo" .\foo\fighters.txtse genera un archivo que contiene en lugar de solo uno fighters.txt.

La respuesta, por lo tanto, es ir al directorio que se está procesando y hacer que el archivo aparezca en el directorio (raíz) anterior, luego regresar a ese directorio para procesar la siguiente carpeta.

También es importante contar con 7zip ignorar archivos CMD postal vigente y dentro del directorio raíz para evitar que acaben dentro del archivo, por lo tanto las -x!*.zipy -x!*.cmdexclusión argumentos.

Este script también mantendrá estructuras recursivas de carpetas.

@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

El código anterior debe copiarse en un archivo por lotes como "compress_dirs.cmd" y ejecutarse como administrador desde el directorio que contiene las carpetas que desea comprimir.

Espero que esto ayude.

Pi Hard
fuente
0

Si necesita mantener la estructura de carpetas y guardar cada archivo en su propia estructura, intente esto:

Guarde este comando en un archivo con extensión .bat y póngalo en la carpeta que necesita comprimir:

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

Nota:

-sdel: elimina el archivo original (opcional, si solo desea mantener el archivo comprimido)

vive el amor
fuente