Como arquivar com subdiretórios usando a linha de comando 7-Zip? Ou, como faço para manter a estrutura de pastas durante o arquivamento?

10

Eu tenho um monte de arquivos como este:

C:\G\G1antique-shop.mp3
C:\G\G2antique-shop.mp3
C:\G\G1saguri.mp3
C:\G\G2saguri.mp3

Eu só quero saber como manter a estrutura de pastas durante o arquivamento. Isso é mais importante que o duplicado, para saber como resolver isso, seria um bônus.

@Lamb "Do you want to archive only selective files (not the whole folder content) from the G1 and G2 folders?"

Isso quase diz tudo, mas vou tentar melhorar: Não só quero mover apenas alguns arquivos selecionados para um arquivo. Eu também tenho uma lista desses arquivos, incluindo nomes de caminho para cada arquivo.

Assim, em SubDir1 pode haver 10 arquivos, dos quais eu quero zip três, e em SubDir1 \ sub2 pode haver cinco arquivos, dos quais eu quero zipar todos os cinco. Os arquivos que preciso arquivar estão em um arquivo de lista.

Pode haver arquivos duplicados, portanto, minha esperança é que, com subdiretórios adicionados, o 7-Zip NÃO os veja como duplicados.

E eu gosto de fazer isso na linha de comando.

Eu tentei um arquivo em lote como este:

7z a -r MyArchive.7z C:\G\G1antique-shop.mp3
7z a -r MyArchive.7z C:\G\G2antique-shop.mp3
7z a -r MyArchive.7z C:\G\G1saguri.mp3
7z a -r MyArchive.7z C:\G\G2saguri.mp3

Isso também significa que os arquivos 01antique-shop.mp3, 02antique-shop.mp3, ...., til 33antique-shop.mp3 e 34antique-shop.mp3, NÃO devem ser arquivados.

Os nomes das pastas (= subdiretórios) não foram adicionados ao MyArchive.7z, e este é o problema.

Obviamente, gostaria de usar apenas um comando com um listfile, mas isso também não funciona.

Eu tentei:

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

que realmente funciona muito bem no que diz respeito à seleção, mas não mantém a estrutura do diretório. Infelizmente,

Como faço isso?

    
por PrincessPooleRulz 02.02.2013 / 08:32

6 respostas

8

A última versão estável do 7-Zip (15.14) tem o switch -spf que permite o armazenamento absoluto do caminho.

Por exemplo, se o arquivo list.txt for

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

o comando 7z a p.7z -spf @list.txt produzirá um arquivamento armazenando os caminhos absolutos como está na lista. Como alternativa, o comando 7z a p.7z -spf2 @list.txt removerá a letra da unidade:

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

Se o arquivo list.txt for

dir1\file.txt
dir2\file.txt

o comando 7z a p.7z @list.txt armazenará os caminhos relativos como estão na lista, nas duas versões 9.20 e 15.14.

Eu fiz mais testes com o switch -spf. Os resultados são aqui .

    
por 08.04.2016 / 23:46
7

Consegui arquivar um diretório com subdiretórios usando o seguinte :

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
    
por 02.02.2013 / 17:22
6

Tente isso:

cd /d C:\
7z a MyArchive.7z G\G1antique-shop.mp3
7z a MyArchive.7z G\G2antique-shop.mp3
7z a MyArchive.7z G\G1saguri.mp3
7z a MyArchive.7z G\G2saguri.mp3

O problema parece ser que as pessoas têm solicitado por anos opções adequadas de armazenamento de caminho (assim como elas têm para o capacidade de modificar arquivos multi-volume ), mas o autor não parece estar interessado. Isso é parte da razão pela qual eu comecei a usar o WinRAR.

Se você tiver um arquivo de lista, o 7-Zip não armazenará os caminhos se os arquivos a serem arquivados não compartilharem um único diretório de nível superior. Por exemplo, se você tiver Input.txt contendo o seguinte:

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

Se você executar 7z a MyArchive.7z @Input.txt , verá que os caminhos foram completamente removidos, o que parece completamente atrasado para mim (OTOH rar a MyArchive.rar @Input.txt faz o trabalho muito bem).

Então, para superar a deficiência do 7-Zip, você pode usar um arquivo em lote da seguinte forma:

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

Observação: Substitua D:\MyArchive.7z pelo caminho correto para o seu arquivo de destino. Além disso, o arquivo em lotes deve funcionar independentemente de você ter citado caminhos no seu arquivo de lista ou não.

Edit: Se o seu listfile se parece com:

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

ou

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

edite-o para ficar assim:

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

Agora, assumindo que todos os arquivos estejam arquivados, acesse C:\$$-edrive , navegue até C: \ e execute 7z a C:\MyArchive.7z @C:\Input.txt . Usando um arquivo de lista, os caminhos serão salvos somente se nenhuma letra de unidade estiver presente, nenhuma barra invertida inicial estiver lá e se o diretório de nível superior (raiz) for o mesmo para todos os arquivos. Além disso, para obter melhores resultados, aconselho não criar MyArchive.7z em C: \ $$ - edrive.

    
por 03.02.2013 / 01:23
0

O 7-Zip os verá como duplicados, e os ignorará. Se há alguma maneira de contornar isso, eu nunca encontrei - eu sempre acabo de dividir o trabalho em vários arquivos.

    
por 02.02.2013 / 08:52
0

Não sabe como ajudar com duplicatas. No entanto, acho que um sistema mais conveniente do que um lote com um comando completo por seria criar um listfile.txt:

 C:\G\G1antique-shop.mp3
 C:\G\G2antique-shop.mp3
 MyArchive.7z C:\G\G1saguri.mp3
 MyArchive.7z C:\G\G2saguri.mp3

Em seguida, compacte-os com 7z a -r -tzip archive.zip @listfile.txt

    
por 11.06.2013 / 23:57
0

Eu criei um script de morcego para usar com 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

Em seguida, em totalcmd, crie um atalho para ele:

Então, quando você quiser zipar alguns arquivos / pastas e preservar a estrutura de pastas relativa a %TOP_DIR% , basta selecionar os arquivos necessários (em algum lugar dentro de %TOP_DIR% ) e pressionar o botão.

    
por 25.01.2017 / 12:06