7zip'te seçilen her dosya / dizin için ayrı zip dosyaları nasıl oluşturabilirim?


30

Bu, Total Commander'ın dahili zip paketleyicisidir:

Total Commander zip packer iletişim kutusunun bir resmi.

Ancak 7zip paketleyicimi kullanmak istiyorum. 5 dosya seçtiğimde, seçilen her dosya için 5 ayrı .zip arşivi alıyorum. 7zip'te bunu nasıl yaparım?

Yanıtlar:


54

Grafik kullanıcı arabirimini kullanarak önerdiğiniz şeyi yapabileceğinizden emin değilim, ancak kesinlikle komut satırından yapabilirsiniz:

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

İlk önce dizini ( cdkomutu), F:\Downloadsdizini veya toplu sıkıştırmayı yapmak istediğiniz dizini değiştirmeniz gerekir . Ayrıca, * .exe veya yalnızca bu belgeleri sıkıştırmak için filtrelemek istediğiniz uzantıyı değiştirmek oldukça kolaydır.

Ve gizli kod çözücü halkası:

  • %i döngüdeki her adım için dosya adını tutan bir değişkendir.
  • (*.*) seçim kriteri, kolayca * .exe veya benzeri olabilir
  • 7z.exe 7-Zip'in komut satırı versiyonu
  • %~ni - bu,% i değişkenini sadece dosya adına genişletir - uzantı yok

Yalnızca belirli bir dizinin klasörlerini eklemek istiyorsanız, komut varsayılan olarak FOR sadece dosyalarla çalıştığından biraz daha karmaşıktır. Bazı ek bilgileri beslememiz gerekiyor:

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

Bu sihir gibi görünen birkaç parça nedeniyle işe yarıyor:

  • /F FOR () 'daki genişletilmiş değerin üzerinden yineleme yapmasını söyler
  • usebackq FOR komutunu geçeceğimi ve çıktıları yinelemek için kullanacağımı söyler
  • delims=?FOR için ?, dosya adlarında ve dizinlerde yasadışı bir karakter olan - jetonları parçalamak istediğimi söyler . Sadece bir jeton istiyorum.
  • /Bİçinde DIRiçindir çıplak formatta sadece adı -
  • /A:Dİçinde DIRözelliğine göre sonuçlar sınırlamak için, D dizinleri içindir

Bunu bir toplu iş dosyasının içine yerleştirmek istiyorsanız, yapmanız gereken tek değişiklik% i değişkenini iki katına çıkarmaktır:

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

Evet, sizinki hariç 7z arşivi, zip arşivi istiyorum! Yani% ~ ni.zip yerine?
Huysuz ol 'Bear,

Daha da iyisi, ultra sıkıştırma ile zip veya 7z istiyorum. VE d: \ paketlenmiş olarak paketleyin. Ama şu ana kadar yönteminiz işe yarıyor!
Huysuz ol 'Bear

1
Anladım. Teşekkür ederim! % İ IN ( . ) DO 7z.exe a "i: \ paketlenmiş \% ~ ni.7z" "% i" -mx9
Huysuz ol 'Bear

Bu arada, bana bir toplu iş dosyasında nasıl yapılacağını gösterebilir misin? yani sperate-archive.bat
Huysuz ol 'Bear,

Teşekkürler ve bu betiğe tüm klasörleri nasıl eklerim?
Huysuz ol 'Bear

15

Goyuix'in cevabını beğendim. Ancak, Windows 7 kullanıyorsanız (ya da Power Shell kurulu ise) ve ayrıca 7-zip, 7za.exe komut satırı sürümünü kullanıyorsanız, şu komutu çalıştırabilirsiniz:

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

Yalnızca çalıştırılabilir dosyaları seçmek için "dir" dosyasını "dir * .exe" olarak da değiştirebilirsiniz.

Power Shell ile ilgili güzel bir şey, dizeleri yerine nesnelerle çalışıyor olmasıdır. Yani istersen çok netleşebilirsin. Örneğin:

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

Bu sadece şunları içeren dosyaları içerecektir:

  1. bir csv uzantısına sahip olmak
  2. 18,900 bayttan daha küçük boyutlu
  3. Son değişiklik tarihi 07.01.2011 tarihinde veya sonrasında

EDIT 7-zip dosyaları yerine zip dosyalarını istiyorsanız, bunun yerine InfoZip's zip.exe dosyasını kullanın.


4
7-zip ayrıca zip dosyaları da oluşturabilir - -t bayrağına bir göz atın. Örnek:7z a -tzip archive.zip *.exe
Goyuix

Tamam, $ _. BaseName $ _. Ad çalışıyor, ancak $ _. BaseName $ _. Adı başka bir sürücüde, başka bir dizinde nasıl yaparım? F: \ test \ file1.7z vs. de.
Huysuz ol 'Bear

0

Total Commander için 7zip eklentisini http://www.ghisler.com/plugins.htm adresinden indirip yükleyebilirsiniz . Pencerenizin sağ tarafında ekran resminizden, 7zip sıkıştırma için başka bir seçim olacaktır. Bu seçenekle tam olarak ne istediğinizi başarabilirsiniz.


0

Tam olarak bu problem üzerinde çalışıyorum ve bulduğum sorunlardan biri arşiv içindeki klasör adının çoğaltılmasıydı, yani "foo" adlı bir klasörü sıkıştırırken .\foo\fighters.txtyalnızca bir tane içeren bir arşiv üretiliyordu fighters.txt.

Bu nedenle cevap, işlenmekte olan dizine girerek arşivin önceki (kök) dizinde görünmesini sağlamak ve ardından bir sonraki klasörü işlemek için o dizine geri dönmektir.

Ayrıca, 7ZIP'in arşiv içerisinde, dolayısıyla -x!*.zipve -x!*.cmddışlama argümanlarında bitmelerini önlemek için kök dizindeki mevcut ZIP ve CMD dosyalarını görmezden gelmesi de önemlidir .

Bu komut dosyası da özyinelemeli klasör yapıları koruyacaktır.

@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

Yukarıdaki kod, "compress_dirs.cmd" gibi bir toplu iş dosyasına kopyalanmalı ve sıkıştırmak istediğiniz klasörleri içeren dizinden admin olarak çalıştırılmalıdır.

Bu yardımcı olur umarım.


0

Klasör yapısını korumanız ve her dosyayı kendi yapısına kaydetmeniz gerekirse, şunu deneyin:

Bu komutu .bat uzantılı bir dosyaya kaydedin ve sıkıştırmanız gereken klasöre yerleştirin:

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

Not:

-sdel: Orijinal dosyayı siler (yalnızca sıkıştırılmış dosyayı saklamak istiyorsanız isteğe bağlı)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.