Como arquivar com subdiretórios usando a linha de comando 7-Zip? Ou, como MANTER a estrutura da pasta durante o arquivamento?

16

Eu tenho um monte de arquivos como este:

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

Eu só quero saber como manter a estrutura da pasta durante o arquivamento. Isso é mais importante do que duplicar, saber como resolver isso, seria um bônus.

@Lamb "Deseja arquivar apenas arquivos seletivos (não todo o conteúdo da pasta) das pastas G1 e G2?"

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

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

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

E eu gosto de fazê-lo na linha de comando.

Eu tentei um arquivo em lotes como este:

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

Isso também significa que os arquivos 01antique-shop.mp3, 02antique-shop.mp3, ...., até 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 esse é o problema.

Obviamente, eu gostaria de usar apenas um comando com um arquivo de lista, 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 de diretórios. Infelizmente.

Como eu faço isso?

PrincessPooleRulz
fonte
Deseja arquivar apenas arquivos seletivos (não todo o conteúdo da pasta) das pastas G1 e G2?
Ankit

Respostas:

12

A versão estável mais recente do 7-Zip (15.14) possui o switch -spf que permite o armazenamento do caminho absoluto.

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.txtproduzirá um arquivo armazenando os caminhos absolutos, como está na lista. Como alternativa, o comando 7z a p.7z -spf2 @list.txtremoverá 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.txtarmazenará os caminhos relativos como está na lista, nas versões 9.20 e 15.14.

Fiz mais testes com o switch -spf. Os resultados estão aqui .

Marco
fonte
Eu estava pesquisando essa idéia por um dia. obrigado !
Moshe L
9

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

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
Eric Roper
fonte
Não consigo encontrar um link direto para o 7zA.exe em nenhum lugar (conforme o seu link), ele é obsoleto e substituído por 7z.exe?
PrincessPooleRulz
@ user194767: 7za.exe é a versão da linha de comandos .
22813 Karan
e, eu gostaria de usá-lo, mas não consigo encontrar o mesmo nessa página, 7-zip.org/download.html. Então, só para esclarecer: com "não é possível encontrar um link direto para o 7zA.exe em qualquer lugar", eu realmente quis dizer: "Por favor, me dê um link direto para este software grátis!" Obrigado!
PrincessPooleRulz
1
@ user194767: Ok, aqui está a versão atual, mas você está me dizendo que não conseguiu encontrar a versão da linha de comando 7-Zip em qualquer lugar dessa página ?!
Karan
Não consegui o 7zA.exe, tentei usar o 7z.exe e funcionou. Não sei para que serve o sinalizador -r, mas não é necessário arquivar subdiretórios.
Eric Roper
7

Tente isso:

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

O problema parece ser que as pessoas solicitam há anos opções de armazenamento de caminho adequadas (assim como têm a capacidade de modificar arquivos com vários volumes ), mas o autor não parece estar interessado. Isso é parte da razão pela qual comecei a usar tanto o WinRAR.


Se você tiver um arquivo de listagem, o 7-Zip não armazenará 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 inverso para mim (a OTOH rar a MyArchive.rar @Input.txtfaz o trabalho muito bem).

Portanto, para superar a deficiência do 7-Zip, você pode usar um arquivo em lotes da seguinte maneira:

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

Nota: Substitua D:\MyArchive.7zpelo caminho apropriado 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 listagem ou não.


Editar: se o seu arquivo de lista se parecer 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 a serem arquivados estejam em 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 não houver letras de unidade, nenhuma barra invertida inicial 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 a não criar o MyArchive.7z em C: \ $$ - edrive.

Karan
fonte
Bem, a resposta foi 3/4 ok. O RAR funcionou super, mas o arquivo em lote funcionou muito bem. Aqui está a saída, e ele só adicionou UM arquivo ao meu arquivo, aquele sem espaços no nome do arquivo___ C: \ Programs \ zippers \ 7-Zip> (pushd "C: \ c: \ Programs \ 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 Verificação Atualizando arquivo c: \ $$ - edrive \ FGH.7z Erro: Não é possível abrir o arquivo FGH.7z.tmp Acesso negado. Erro do sistema: erro indefinido ===== O mais importante talvez seja o erro de acesso negado?
PrincessPooleRulz
Você pode adicionar algumas linhas de amostra (com espaços e sem) do seu arquivo de listagem real à sua pergunta acima?
Karan
ok, então substituí todos os espaços por pontos nos nomes de arquivos, mas não nos nomes de caminho, o que tentarei agora. a saída ainda é: C: \ Programs \ zippers \ 7-Zip> (______ pushd c: _______ c: \ Programs \ zippers \ 7-Zip \ 7z.exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ F \ filmmusic_14mp3_foretean \ starcraft .-. starcraft.vs.south.park.mp3 "_______ popd________) ________ Digitalização Atualizando arquivo c: \ $$ - edrive \ FGH.7z Erro: Não é possível abrir o arquivo FGH.7z.tmp Access negado. Erro de sistema: erro indefinido
PrincessPooleRulz
"Substituí todos os espaços por pontos nos nomes dos arquivos" - o que significa que você renomeou os arquivos reais ou apenas editou o arquivo de lista? Os espaços nos nomes de arquivos e caminhos devem estar bem, veja minha edição acima (ou seja, do seu arquivo de lista remova C: \ e coloque aspas em todos os caminhos). Agora você deve poder usar 7z diretamente em vez da minha solução alternativa para arquivos em lote.
31413 Karan
1. Renomeei ambos = = = = = = 2. Fizemos suas alterações, mas ainda não funciona com 7z = = = = = = = 3. $$ - edrive \ é realmente o único diretório superior. = = = = = 4. Mensagens de erro = = = = = AVISOS para arquivos: = = = = = $$ - edrive: O sistema não pode encontrar esse arquivo. = = = = = = = = = = "$$ - edrive: O sistema não pode encontrar esse arquivo. = = = = = = = = = = = AVISO: Não é possível encontrar 2 arquivos = = = = = C: \ Programas \ zippers \ 7-Zip> = = = = = note que existem dois avisos, e o segundo começa com uma aspas duplas ... Estranho?
PrincessPooleRulz
0

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

MT_Head
fonte
você sabe como manter a estrutura da pasta ao compactar arquivos em um arquivo morto? Eles dizem que esse é o padrão, mas NÃO é.
PrincessPooleRulz
@ user194767 - Uso uma linha de comando como esta: %ZDIR%\7z a -t7z -r -mx=1 %ZIP%\mydocu "c:\My Documents\*.*" -wc:\temponde ZDIRestá o caminho para o 7-Zip e ZIPa unidade de destino.
MT_Head 02/02
0

Não sabe como ajudar com duplicatas. No entanto, acho que um sistema mais conveniente do que um lote com um comando completo seria criar um 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 depois comprima todos eles com 7z a -r -tzip archive.zip @listfile.txt

Cosine
fonte
0

Eu criei um script bat 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 totalcmd, crie um atalho para ele: insira a descrição da imagem aqui

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

grabantot
fonte