Come posso archiviare con le sottodirectory usando la riga di comando di 7-Zip? Oppure, come posso conservare la struttura delle cartelle durante l'archiviazione?


16

Ho un sacco di file come questo:

C:\G\G1\35antique-shop.mp3
C:\G\G2\35antique-shop.mp3
C:\G\G1\09saguri.mp3
C:\G\G2\09saguri.mp3

Voglio solo sapere come mantenere la struttura delle cartelle durante l'archiviazione. Questo è più importante della cosa duplicata, sapere come risolverlo, sarebbe un bonus.

@Lamb "Vuoi archiviare solo i file selettivi (non l'intero contenuto della cartella) dalle cartelle G1 e G2?"

Questo dice quasi tutto, ma cercherò di migliorare: non solo voglio spostare solo alcuni file selezionati in un archivio. Ho anche un elenco di questi file, inclusi i nomi dei percorsi per ciascun file.

Quindi, in SubDir1 potrebbero esserci 10 file, di cui voglio comprimerne tre, e in SubDir1 \ sub2 potrebbero esserci cinque file, di cui voglio comprimere tutti e cinque. I file che devo archiviare sono in un file di elenco.

Potrebbero esserci file duplicati, quindi la mia speranza è che con le sottodirectory aggiunte, 7-Zip NON li veda come duplicati.

E mi piace farlo dalla riga di comando.

Ho provato un file batch come questo:

7z a -r MyArchive.7z C:\G\G1\35antique-shop.mp3
7z a -r MyArchive.7z C:\G\G2\35antique-shop.mp3
7z a -r MyArchive.7z C:\G\G1\09saguri.mp3
7z a -r MyArchive.7z C:\G\G2\09saguri.mp3

Questo significa anche che i file 01antique-shop.mp3, 02antique-shop.mp3, ...., fino a 33antique-shop.mp3 e 34antique-shop.mp3, NON devono essere archiviati.

I nomi di cartella (= sottodirectory) non sono stati aggiunti a MyArchive.7z e questo è il problema.

Ovviamente, mi piacerebbe usare un solo comando con un file di elenco, ma neanche quello funziona.

Ho provato:

7z a -mx0 -tzip C:\$$-edrive\F-G-H.zip @fgh.txt

che in realtà funziona abbastanza bene per quanto riguarda la selezione, ma NON mantiene la struttura della directory. Purtroppo.

Come faccio a fare questo?


Vuoi archiviare solo i file selettivi (non l'intero contenuto della cartella) dalle cartelle G1 e G2?
Ankit

Risposte:


12

L'ultima versione stabile di 7-Zip (15.14) ha lo switch -spf che consente l'archiviazione del percorso assoluto.

Ad esempio, se il file list.txt è

C:\tmp\dir1\file.txt
C:\tmp\dir2\file.txt

il comando 7z a p.7z -spf @list.txtprodurrà un archivio che memorizza i percorsi assoluti come è nella lista. In alternativa, il comando 7z a p.7z -spf2 @list.txtrimuoverà la lettera di unità:

tmp\dir1\file.txt
tmp\dir2\file.txt

Se il file list.txt è

dir1\file.txt
dir2\file.txt

il comando 7z a p.7z @list.txtmemorizzerà i percorsi relativi così come sono nell'elenco, in entrambe le versioni 9.20 e 15.14.

Ho fatto più test con l'interruttore -spf. I risultati sono qui .


Ho cercato quest'idea per un giorno. Grazie !
Moshe L

9

Ho ottenuto per archiviare una directory con le sottodirectory usando il seguente :

7z.exe a - t7z NewArchivePath PathOfFolderToArchive

Non riesco a trovare un collegamento diretto a 7zA.exe da nessuna parte (come per il tuo collegamento), è obsoleto e sostituito da 7z.exe?
PrincessPooleRulz,

@ user194767: 7za.exe è la versione della riga di comando .
Karan,

e mi piacerebbe usarlo, ma non riesco a trovare un like su quella pagina, 7-zip.org/download.html. Quindi, per essere chiari: con "non riesco a trovare un collegamento diretto a 7zA.exe da nessuna parte" Intendevo davvero: "Per favore, dammi un collegamento diretto a questo software gratuito!" Grazie!
PrincessPooleRulz,

1
@ user194767: Ok, ecco la versione attuale, ma mi stai dicendo che non puoi individuare la versione da 7-Zip Command Line da nessuna parte in quella pagina ?!
Karan,

Non ho potuto 7zA.exe, quindi ho provato a utilizzare 7z.exe e ha funzionato. Non sono sicuro per cosa venga utilizzato il flag -r ma non è necessario per archiviare le sottodirectory.
Eric Roper,

7

Prova questo invece:

cd /d C:\
7z a MyArchive.7z G\G1\35antique-shop.mp3
7z a MyArchive.7z G\G2\35antique-shop.mp3
7z a MyArchive.7z G\G1\09saguri.mp3
7z a MyArchive.7z G\G2\09saguri.mp3

Il problema sembra essere che le persone chiedono da anni opzioni di archiviazione dei percorsi adeguate (proprio come hanno per la possibilità di modificare archivi multi-volume ), ma l'autore non sembra essere interessato. Questo è uno dei motivi per cui ho iniziato a utilizzare WinRAR così tanto.


Se si dispone di un file di elenco, 7-Zip non memorizzerà i percorsi se i file da archiviare non condividono una singola directory di livello superiore. Ad esempio se hai Input.txt contenente quanto segue:

C:\path to\file1.ext
D:\path to\file1.ext
E:\path to\file1.ext

Se corri 7z a MyArchive.7z @Input.txt, vedrai che i percorsi sono stati completamente spogliati, il che mi sembra completamente all'indietro (OTOH rar a MyArchive.rar @Input.txtfa bene il lavoro).

Quindi, per ovviare al difetto di 7-Zip, puoi usare un file batch come segue:

for /f "tokens=1* delims=\" %%i in (Input.txt) do (
    pushd %%i\
    7z a D:\MyArchive.7z "%%j"
    popd
)

Nota: sostituire D:\MyArchive.7zcon il percorso corretto per l'archivio di destinazione. Inoltre, il file batch dovrebbe funzionare indipendentemente dal fatto che tu abbia o meno quotato i percorsi nel tuo file di elenco.


Modifica: se il tuo file di elenco è simile a:

"C:\$$-edrive\F\faithless.-.long.way.mp3"
"C:\$$-edrive\G\Antique Shop.mp3"

o

"\$$-edrive\F\faithless.-.long.way.mp3"
"\$$-edrive\G\Antique Shop.mp3"

quindi modificalo in questo modo invece:

"$$-edrive\F\faithless.-.long.way.mp3"
"$$-edrive\G\Antique Shop.mp3"

Ora supponendo che tutti i file da archiviare siano sotto C:\$$-edrive, vai su C: \ ed esegui 7z a C:\MyArchive.7z @C:\Input.txt. Utilizzando un file elenco i percorsi verranno salvati solo se non sono presenti lettere di unità, non sono presenti barre rovesciate iniziali e se la directory di livello superiore (radice) è la stessa per tutti i file. Inoltre, per i migliori risultati, ti consiglio di non creare MyArchive.7z in C: \ $$ - edrive.


Bene, la risposta è stata 3/4 ok. RAR ha funzionato alla grande, ma il file batch ha funzionato bene. Ecco l'output e ha aggiunto solo UN file al mio archivio, quello senza spazi nel nome file___ C: \ Programmi \ zippers \ 7-Zip> (pushd "C: \ c: \ Programmi \ zippers \ 7-Zip \ 7z .exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ G \ gattaca_7mp 3_zefen \ gattaca - 03 the one moment.mp3" "popd) 7-Zip 4.65 Copyright (c) 1999-2009 Igor Pavlov 2009 Scansione Aggiornamento dell'archivio c: \ $$ - edrive \ FGH.7z Errore: impossibile aprire il file FGH.7z.tmp Accesso negato. Errore di sistema: errore non definito ===== È più importante l'errore di accesso negato?
PrincessPooleRulz,

Puoi aggiungere alcune righe di esempio (con spazi e senza) dal tuo vero file di elenco alla domanda sopra?
Karan,

ok, quindi ho sostituito tutti gli spazi con punti nei nomi dei file, ma non nei nomi dei percorsi, che proverò ora. l'output è ancora: C: \ Programmi \ zippers \ 7-Zip> (______ pushd c: _______ c: \ Programmi \ zippers \ 7-Zip \ 7z.exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ F \ filmmusic_14mp3_foretean \ starcraft .-. starcraft.vs.south.park.mp3 "_______ popd________) ________ Scansione Aggiornamento archivio c: \ $$ - edrive \ FGH.7z Errore: Impossibile aprire il file FGH.7z.tmp Accesso negato. Errore di sistema: errore indefinito
PrincessPooleRulz

"Ho sostituito tutti gli spazi con punti nei nomi dei file" - Significa che hai rinominato i file effettivi o hai appena modificato il file di elenco? Gli spazi sia nei nomi dei file che nei percorsi dovrebbero andare bene, vedi la mia modifica sopra (cioè dal tuo file di elenco rimuovi C: \ e metti le virgolette attorno a tutti i percorsi). Ora dovresti essere in grado di utilizzare 7z direttamente invece della soluzione alternativa del mio file batch.
Karan,

1. Ho rinominato entrambi = = = = = = 2. Ho apportato le tue modifiche, ma non funziona ancora con 7z = = = = = = 3. $$ - edrive \ è in effetti l'unica directory principale. = = = = = 4. Messaggi di errore = = = = = AVVERTENZE per i file: = = = = = $$ - edrive: il sistema non riesce a trovare quel file. = = = = = = = = = = "$$ - edrive: il sistema non riesce a trovare quel file. = = = = = = = = = = = ATTENZIONE: Impossibile trovare 2 file = = = = = C: \ Programmi \ zippers \ 7-Zip> = = = = = nota che ci sono due avvertimenti e il secondo inizia con una doppia citazione ... Strano?
PrincessPooleRulz

0

7-Zip li vedrà come duplicati a prescindere e li salterà. Se c'è un modo per aggirare questo, non l'ho mai trovato, ho sempre diviso il lavoro in diversi archivi.


sai come MANTENERE la struttura delle cartelle mentre comprimi i file in un archivio? Dicono che è l'impostazione predefinita, ma NON lo è.
PrincessPooleRulz,

@ user194767 - Uso una riga di comando come questa: %ZDIR%\7z a -t7z -r -mx=1 %ZIP%\mydocu "c:\My Documents\*.*" -wc:\tempdov'è ZDIRil percorso di 7-Zip ed ZIPè l'unità di destinazione.
MT_Head

0

Non sono sicuro di come aiutare con i duplicati. Tuttavia, penso che un sistema più conveniente di un batch con un comando completo per sarebbe quello di creare un listfile.txt:

 C:\G\G1\35antique-shop.mp3
 C:\G\G2\35antique-shop.mp3
 MyArchive.7z C:\G\G1\09saguri.mp3
 MyArchive.7z C:\G\G2\09saguri.mp3

E poi comprimili tutti con 7z a -r -tzip archive.zip @listfile.txt


0

Ho creato uno script bat da utilizzare con totalcmd "tot-zip.bat":

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set "TOP_DIR="D:\Grabovsky""
set "archname="%TOP_DIR%\arch.zip""
set "filelist= "
cd %TOP_DIR%
for %%A in (%*) do (
    set ondisk_path="%%~dpnxA"
    set inarch_path=!ondisk_path:%TOP_DIR%\=!
    echo Putting !ondisk_path! to !inarch_path!.
    set "filelist=!filelist! !inarch_path!"
)
echo filelist: %filelist%

7z.exe a -tzip %archname% %filelist% > NUL
pause

Quindi in totalcmd crea un collegamento per questo: inserisci qui la descrizione dell'immagine

Quindi quando vuoi comprimere alcuni file / cartelle e preservare la struttura delle cartelle relativamente a %TOP_DIR%te basta selezionare i file necessari (da qualche parte all'interno %TOP_DIR%) e premere il pulsante.

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.