Como fazer com que o 7-zip faça um monte de pastas

18

Tirei várias fotos que tive que cortar em 800x600 pixels. Isso foi feito com facilidade, mas agora tenho que carregá-los para que a família possa vê-los todos.

A coisa é, isso é 500MB em imagens. Decidi simplesmente compactar as pastas separadas, cada uma contendo uma quantidade quase igual de fotos. Dessa forma, eu posso enviar um casal por dia. Fazer isso manualmente é um trabalho muito longo e difícil. Gostaria de saber se existe uma maneira de fazer 7-zip lidar com cada pasta individualmente?

Acho que vou precisar de um arquivo em lotes para fazer isso, mas não sou bom nisso. Coloquei tudo em uma pasta. Nas várias subpastas é onde as imagens estão localizadas. O que eu preciso é que o conteúdo dessa pasta seja compactado. Não tenho certeza se posso apenas compactar a pasta junto com ela. Eu sei que o PHP tem um módulo zip, eu nunca trabalhei com ele, então não tenho certeza se ele pode lidar com o fato de que o conteúdo do zip é uma pasta que contém os itens, em vez de apenas os itens.

KdgDev
fonte
1
De quantas pastas você está falando? 7? 147? Se você não é bom com arquivos em lote, mas talvez seja uma boa oportunidade para enfrentar esse desafio. :)
JMD
Total de 105 pastas
KdgDev

Respostas:

25

Executar a partir de um prompt de comando cujo diretório de trabalho é seu My Picturesdiretório, este comando criará um arquivo zip do conteúdo de cada subdiretório, deixando todos os arquivos zip em seu My Picturesdiretório.

Editar: eu adicionei as aspas necessárias para permitir diretórios com espaços em seus nomes.

for /D %%d in (*.*) do 7z a -tzip "%%d.zip" "%%d"

Além disso: A versão a seguir não colocará arquivos em um subdiretório dentro do arquivo zip, mas em sua raiz:

for /D %%d in (*.*) do 7z a -tzip "%%d.zip" ".\%%d\*"

No Windows 7 e superior

for /D %d in (*.*) do 7z a -tzip "%d.zip" "%d"

ou

for /D %d in (*.*) do 7z a -tzip "%d.zip" ".\%d\*"
onze81
fonte
Tentei adicionar a pasta 7-zip ao meu caminho de classe, mas não funcionará. Se eu usar a string inteira para localizar o executável em vez de apenas 7z, ele funcionará. Eu acho que a adição dessa string ao caminho da classe deve ter o mesmo efeito?
KdgDev
O classpathé onde Java procura por classes e bibliotecas. google.com/search?q=classpath Você aparentemente confundiu isso com o pathlocal em que o shell procura por executáveis.
eleven81
Pergunta: o script funciona, mas não quando há espaços no nome da pasta ...
KdgDev
Obrigado pela atualização. Com o segundo script, você quer dizer que o conteúdo do zip será "achatado"?
KdgDev
6
Isso funcionou muito bem para mim, embora eu tenha que mudar %%dpara %dminha caixa do Win 7 reclamando que o nome do var é muito longo, gerando um erro "%% d era inesperado no momento".
Benjam
7

Não consegui que a linha de comando funcionasse. Em vez disso, baixei o WinRAR e o mtone estava correto - o WinRAR tem a opção de compactar várias pastas em seus próprios arquivos ZIP separados.

Por exemplo, C:\Files\Fables 01em C:\Files\Fables 01.zipe C:\Files\Fables 02em C:\Files\Fables 02.zip.

Com o WinRAR, abra a pasta que contém as pastas que você deseja compactar e siga estas etapas:

  • Selecione todas as pastas que você deseja compactar / compactar
  • Clique em "ADICIONAR" ou Alt+ Aou Comandos -> "Adicionar arquivos ao arquivo"
  • Selecione RAR ou ZIP
  • vá para a aba "Arquivos"
  • Marque "Colocar cada arquivo em um arquivo separado" na caixa Arquivos

Quando você tiver outras configurações que desejar, aperte OK e boom: vários arquivos ZIP de várias pastas. Isso funcionou muito mais fácil do que a linha de comando 7zip.

user134042
fonte
Mesmo que diga "cada arquivo", esta caixa de seleção também funciona com pastas.
dhaupin
1
De todas as soluções propostas aqui, esta funcionou melhor para mim em 2018. Certifique-se de verificar se deseja que o arquivo seja compactado em .zip ou haverá um monte de arquivos .rar.
precisa saber é o seguinte
5

Apenas uma pequena atualização da resposta de onze81: O código abaixo cria um arquivo em lotes no qual vários itens podem ser descartados.

@echo off
if [%1]==[] goto :eof
:loop
7z a -tzip "%~1.zip" "%~1"
shift
if not [%1]==[] goto loop

Este arquivo em lotes pode ser adicionado ao menu de contexto por meio do registro:

  1. crie uma nova chave em [HKEY_CLASSES_ROOT \ Folder \ shell], chame-a de cmd1
  2. Edite o valor da string e chame-o de 'Batch Zip'
  3. crie outra nova chave sob esta e chame-a de comando
  4. Altere o valor disso para o seu caminho, com barras com escape duplo

Por exemplo, minha entrada é "C: \ Users \ Rory \ Dropbox \ _apps \ batch_zip.bat" "% 1"

Depois de fazer isso, você terá uma entrada no menu de contexto para 'Zip em lote', que compactará em lote todas as pastas selecionadas em arquivos separados

No entanto, se você fizer isso através do menu de contexto, infelizmente, todas as operações serão executadas simultaneamente e, como qualquer pessoa que tenha feito muitos zíperes e descompactadores saberá, as pastas compactadas funcionarão muito mais rapidamente uma após a outra do que todas de uma vez.

Se alguém souber uma maneira de corrigir isso no registro, informe.

Arrastar as pastas selecionadas para o lote fará uma após a outra.

roryok
fonte
1
O exe 7z não estava no meu caminho, então tive que editar um pouco o seu script. "C: \ Arquivos de programas (x86) \ 7-Zip \ 7z.exe" a -tzip "% ~ 1.zip" "% ~ 1"
Ryan
1
+1 por incentivar a preguiça com arrastar e soltar lol. Acabei de publicar uma versão modificada @ http://superuser.com/a/1160047/678687
Enteleform
3

Dica: se suas imagens são JPGs, elas já estão compactadas. use o 7-Zip no modo 'archive' sem compactação (nível de compactação: armazenamento), isso acelerará tremendamente o processo.

mesmo se você usar Ultra compressão, dificilmente ganhará 5%, certamente não vale o esforço.

Eu estava pensando em termos de praticamente adicionar anexos.

eu não os enviaria como anexo de email. em vez disso, faça o upload para o chamado servidor de hospedagem com um clique (por exemplo, opções drop.io, rs, mu, ms etc.) e envie o link de download por e-mail para seus amigos e familiares.


fonte
2
Eles serão mais fáceis de enviar, no entanto.
Rook
eu não acho que há muita diferença no envio 475 ou 500 MB, certamente não o suficiente para compensar o tempo que leva para comprimir um zilhão JPGs com 'Ultra' :)
Eu estava pensando em termos de praticamente adicionar anexos. É mais fácil adicionar um arquivo como anexo em vez de 10. (quando o número de arquivos aumenta, isso se torna irritante).
Rook
Por isso, Molly sugeriu o modo "arquivar"; que enche-los todos em um único arquivo, sem perder tempo tentando compressa algo que já está comprimido ...
Adrien
É verdade que eu estava me referindo à sua última frase, mas, mesmo assim, mesmo com pequena redução no tamanho dos arquivos jpeg (e às vezes não é tão pequeno, na verdade), ainda vale a pena. O tempo gasto na compactação é muito menor do que o tempo gasto no upload, digamos, no Gmail ou em algum outro correio (o Gmail possui uma permissão de tamanho de anexo relativamente grande).
Rook
2

Eu encontrei roryok 's resposta a ser muito útil, ele forneceu um batch scriptpara Windowsque lhe permite drag-&-droparquivos para arquivamento rápida, automatizada.


Para usar esse script, salve-o com uma .batextensão e, em seguida, você pode arrastar e soltar arquivos e / ou pastas para o arquivo em lotes ( ou um atalho para o arquivo em lotes ).

.ziparquivos serão criados no mesmo diretório que os arquivos de origem.
( embora o destino possa ser alterado no script @archivePath )


Algumas atualizações que fiz para melhorar a facilidade de personalização e a funcionalidade geral:

  • adicionadas variáveis ​​nomeadas
  • implementou um forloop que itera pelos argumentos fornecidos
    ( junto com delayedexpansionpara permitir variáveis ​​de tempo de execução )
  • ifcondições adicionais para diferenciar filesefolders
    • isso permite que o conteúdo da pasta seja adicionado diretamente ao arquivo morto em vez de incluir a pasta pai dentro do arquivo morto
      ( EG:   \archive.zip\file.txt   VS   \archive.zip\parent_folder\file.txt )
  • adicionado um log de erros para exibir instâncias com falha ou exibir uma mensagem de sucesso se não houver erros

@Echo OFF
SetLocal EnableDelayedExpansion



Rem //  7-Zip Executable Path
Set sevenZip="C:\Program Files\7-Zip\7z.exe"



Rem // START: NewLine Variable Hack
Set newLine=^


Rem // END: NewLine Variable Hack !! DO NOT DELETE 2 EMPTY LINES ABOVE !!



Rem //  Set ErrorLog Variables
Set errorCount=0
Set separator=--------------------------------------------------------
Set errorLog=!newLine!!newLine!!separator!!newLine!!newLine!
Set errorPrefix=ERROR @:
Set successMessage=All Files Were Successfully Archived



Rem //  Loop Through Each Argument
SetLocal DisableDelayedExpansion
for %%x in (%*) do (

    Rem //  Use Current Argument To set File, Folder, & Archive Paths
    SetLocal DisableDelayedExpansion
    Set filePath="%%~x"
    Set directoryFiles="%%~x\*"
    Set archivePath="%%~x.zip"
    SetLocal EnableDelayedExpansion

    Rem //  Source Is A Folder
    if exist !directoryFiles! (
            Set sourcePath=!directoryFiles!
    )

    Rem //  Source Is A File
    if not exist !directoryFiles! (
            Set sourcePath=!filePath!
    )

    Rem //  Print Separator To Divide 7-Zip Output
    echo !newLine!!newLine!!separator!!newLine!!newLine!

    Rem //  Add Files To Zip Archive
    !sevenZip! A -TZIP !archivePath! !sourcePath!

    Rem //  Log Errors
    if ErrorLevel 1 (
        Set /A errorCount=errorCount+1
        Set errorLog=!errorLog!!newLine!!errorPrefix!!sourcePath!
    )
)



Rem //  Print ErrorLog
if !errorCount!==0 (
    Set errorLog=!errorLog!!newLine!!successMessage!
)
Echo !errorLog!!newLine!!newLine!!newLine!



Rem //  Keep Window Open To View ErrorLog
pause
Enteleform
fonte
1

O 7-zip tem a opção de descompactar todos os arquivos em sua própria pasta (* /), mas não possui os comandos de contexto para executar a ação oposta que você está procurando.

Dito isto, lembro-me de fazer exatamente isso usando o winrar no passado. Há uma opção "arquivo único por pasta" ou algo nesse sentido.

mtone
fonte
-1

Obtenha o picasa e faça o upload para o álbum da web do picasa. Todo mundo pode facilmente obter as fotos on-line e visualizá-las.Pode até carregar os originais (para que sua família possa imprimir as versões maiores)

Kurru
fonte
Se você acha que as pessoas ficarão felizes com o download e extrair arquivos zip acho que vai ser muito desapontados ... interface web é muito mais fácil para todos os envolvidos ....
Kurru