Come posso creare file zip separati per ogni file / directory selezionato in 7zip?


30

Questo è lo zip packer interno di Total Commander:

Un'immagine della finestra di dialogo del programma di compressione zip Total Commander.

Tuttavia, voglio usare il mio packer 7zip. Quando seleziono 5 file, ottengo 5 archivi .zip separati per ogni file selezionato. Come posso farlo in 7zip?

Risposte:


54

Non sono sicuro che puoi fare ciò che stai suggerendo utilizzando l'interfaccia utente grafica, ma puoi certamente dalla riga di comando:

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

Dovresti prima cambiare la directory (il cdcomando) nella F:\Downloadsdirectory o qualunque directory desideri eseguire la compressione di massa. Inoltre, è abbastanza facile sostituire in * .exe o in qualsiasi estensione che si desidera filtrare per comprimere solo quei documenti.

E l'anello del decodificatore segreto:

  • %i è una variabile che contiene il nome del file per ogni passaggio nel ciclo
  • (*.*) è il criterio di selezione, potrebbe essere facilmente * .exe o simile
  • 7z.exe è la versione della riga di comando di 7-Zip
  • %~ni - questo espande la variabile% i al solo nome del file - nessuna estensione

Se si desidera solo aggiungere le cartelle per una determinata directory, il comando è un po 'più complesso poiché, per impostazione predefinita, FOR funziona solo con i file. Dobbiamo fornirgli alcune informazioni aggiuntive:

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

Questo funziona a causa di alcuni pezzi di quella che sembra magia:

  • /F dice a FOR di scorrere il valore espanso in ()
  • usebackq dice a FOR che ho intenzione di passare un comando e utilizzare l'output per iterare
  • delims=?dice a FOR che voglio spezzare i token a parte ?- un personaggio illegale nei nomi di file e nelle directory. Voglio solo un token.
  • L' /Ba DIRè per formato a nudo - solo il nome
  • L' /A:Da DIRè per limitare i risultati per l'attributo, la D è per le directory

Se vuoi incapsulare questo all'interno di un file batch, l'unica modifica che dovrai apportare è di doppio escape della variabile% i:

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

Sì, tranne che il tuo è un archivio 7z, voglio un archivio zip! Quindi% ~ ni.zip invece?
Orso scontroso il

Meglio ancora, voglio zip o 7z con compressione ultra. E impacchettalo in d: \ pacchetto. Ma finora il tuo metodo funziona!
Orso scontroso il

1
Capito. Grazie! FOR% i IN ( . ) DO 7z.exe a "i: \ pacchetto \% ~ ni.7z" "% i" -mx9
Orso scontroso il

A proposito, puoi mostrarmi come farlo in un file batch? cioè sperate-archive.bat
Grumpy ol 'Bear,

Grazie e come posso aggiungere intere cartelle a quello script, per favore?
Grumpy ol 'Bear,

15

Mi piace la risposta di Goyuix. Tuttavia, se si utilizza Windows 7 (o è installato Power Shell) e si utilizza anche la versione della riga di comando di 7-zip, 7za.exe, è possibile eseguire questo comando:

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

Puoi anche cambiare "dir" in "dir * .exe" per selezionare solo i file eseguibili.

Una cosa bella di Power Shell è che stai lavorando con oggetti invece che con stringhe. Quindi potresti diventare davvero specifico se lo desideri. Per esempio:

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

Ciò includerà solo file che:

  1. avere un'estensione csv
  2. di dimensioni inferiori a 18.900 byte
  3. ultima modifica il 7/1/2011 o dopo

MODIFICA Se si desidera file zip anziché 7-zip, utilizzare invece zip.exe di InfoZip .


4
7-zip può anche creare file zip - dai un'occhiata al flag -t. Esempio:7z a -tzip archive.zip *.exe
Goyuix,

Ok, $ _. BaseName $ _. Il nome funziona, ma come posso fare $ _. BaseName $ _. Nome su un'altra unità, in un'altra directory? Dì f: \ test \ file1.7z ecc.
Grumpy ol 'Orso il

0

Puoi scaricare e installare il plugin 7zip per Total Commander da http://www.ghisler.com/plugins.htm Una volta che lo fai sul lato destro della finestra dallo screenshot ci sarà un'altra selezione per la compressione 7zip. Con questa opzione puoi realizzare esattamente quello che stai chiedendo.


0

Ho appena lavorato esattamente su questo problema e uno dei problemi che ho riscontrato è stato la duplicazione del nome della cartella all'interno dell'archivio, vale a dire quando si comprime una cartella chiamata "pippo" .\foo\fighters.txtviene prodotto un archivio invece di uno solo fighters.txt.

La risposta, quindi, è quella di accedere alla directory in elaborazione e fare in modo che l'archivio appaia nella directory (root) precedente, quindi tornare a quella directory per elaborare la cartella successiva.

È anche importante che 7ZIP ignori i file ZIP e CMD esistenti all'interno della directory principale per impedire che finiscano all'interno dell'archivio, quindi gli argomenti di esclusione -x!*.zipe -x!*.cmd.

Questo script manterrà anche le strutture di cartelle ricorsive.

@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

Il codice sopra deve essere copiato in un file batch come "compress_dirs.cmd" ed eseguito come amministratore dalla directory contenente le cartelle che si desidera comprimere.

Spero che sia di aiuto.


0

Se è necessario mantenere la struttura delle cartelle e salvare ogni file nella propria struttura, provare questo:

Salvare questo comando in un file con estensione .bat e inserirlo nella cartella che è necessario comprimere:

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

Nota:

-sdel: elimina il file originale (facoltativo, se si desidera mantenere solo il file compresso)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.