Bagaimana cara membuat file zip terpisah untuk setiap file / direktori yang dipilih di 7zip?

30

Ini adalah pengemas zip internal dari Total Commander:

Gambar kotak dialog Total pack Commander zip packer.

Namun saya ingin menggunakan paket 7zip saya. Ketika saya memilih 5 file, saya mendapatkan 5 arsip .zip terpisah untuk setiap file yang dipilih. Bagaimana saya melakukannya di 7zip?

Beruang yang pemarah
sumber

Jawaban:

54

Saya tidak yakin Anda bisa melakukan apa yang Anda sarankan menggunakan antarmuka pengguna grafis, tetapi Anda tentu bisa dari baris perintah:

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

Anda perlu mengubah direktori ( cdperintah) ke F:\Downloadsdirektori terlebih dahulu, atau direktori apa pun yang Anda inginkan untuk melakukan kompresi massal. Juga, cukup mudah untuk mengganti * .exe atau ekstensi apa pun yang ingin Anda filter untuk hanya mengompresi dokumen-dokumen itu.

Dan cincin dekoder rahasia:

  • %i adalah variabel yang menyimpan nama file untuk setiap langkah dalam loop
  • (*.*) adalah kriteria pemilihan, bisa dengan mudah * .exe atau serupa
  • 7z.exe adalah versi baris perintah 7-Zip
  • %~ni - ini memperluas variabel% i menjadi hanya nama file - tanpa ekstensi

Jika Anda hanya ingin menambahkan folder untuk direktori yang diberikan, perintahnya sedikit lebih rumit karena secara default FOR hanya bekerja dengan file. Kami perlu memberinya beberapa informasi tambahan:

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

Ini bekerja karena beberapa bagian dari apa yang tampak seperti sulap:

  • /F memberitahu FOR untuk mengulangi nilai yang diperluas di ()
  • usebackq memberitahu FOR bahwa saya akan memberikan perintah dan menggunakan output untuk beralih
  • delims=?memberitahu FOR bahwa saya ingin memecah token di ?- karakter ilegal dalam nama file dan direktori. Saya hanya ingin satu token.
  • The /Bdalam DIRadalah untuk format yang telanjang - hanya nama
  • The /A:Ddalam DIRadalah untuk membatasi hasil dengan atribut, D adalah untuk direktori

Jika Anda ingin merangkum ini di dalam file batch, satu-satunya perubahan yang perlu Anda lakukan adalah dengan meloloskan diri dari variabel% i:

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
Goyuix
sumber
Ya, kecuali arsip Anda 7z, saya ingin arsip zip! Jadi% ~ ni.zip saja?
Grumpy ol 'Bear
Lebih baik lagi, saya ingin zip atau 7z dengan kompresi ultra. DAN kemas dalam d: \ dikemas. Namun sejauh ini metode Anda berhasil!
Grumpy ol 'Bear
1
Terima kasih, terima kasih! UNTUK% i IN ( . ) LAKUKAN 7z.exe a "i: \ packed \% ~ ni.7z" "% i" -mx9
Grumpy ol 'Bear
Omong-omong, dapatkah Anda menunjukkan kepada saya bagaimana melakukannya dalam file batch? yaitu sperate-archive.bat
Grumpy ol 'Bear
Terima kasih, dan bagaimana cara menambahkan seluruh folder ke skrip itu?
Grumpy ol 'Bear
15

Saya suka jawaban Goyuix. Namun, jika Anda menggunakan Windows 7 (atau memasang Power Shell) dan juga menggunakan versi baris perintah 7-zip, 7za.exe, maka Anda dapat menjalankan perintah ini:

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

Anda juga dapat mengubah "dir" menjadi "dir * .exe" untuk hanya memilih file yang dapat dieksekusi.

Satu hal yang baik tentang Power Shell adalah bahwa Anda bekerja dengan objek, bukan string. Jadi Anda bisa menjadi sangat spesifik jika Anda mau. Sebagai contoh:

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

Ini hanya akan mencakup file yang:

  1. memiliki ekstensi csv
  2. kurang dari 18.900 byte dalam ukuran
  3. terakhir dimodifikasi pada atau setelah 7/1/2011

EDIT Jika Anda ingin file zip bukan file 7-zip, gunakan InfoZip's zip.exe sebagai gantinya.

jftuga
sumber
4
7-zip juga dapat membuat file zip - lihat flag -t. Contoh:7z a -tzip archive.zip *.exe
Goyuix
Ok, $ _. BaseName $ _. Nama berfungsi, tetapi bagaimana saya melakukan $ _. BaseName $ _. Nama di drive lain, di direktori lain? Katakan f: \ test \ file1.7z dll.
Grumpy ol 'Bear
0

Anda dapat mengunduh dan menginstal plugin 7zip untuk Total Commander dari http://www.ghisler.com/plugins.htm Setelah Anda melakukannya di sisi kanan jendela dari tangkapan layar Anda, akan ada pilihan lain untuk kompresi 7zip. Dengan opsi itu Anda dapat mencapai apa yang Anda minta.

Mxx
sumber
0

Saya baru saja bekerja pada masalah ini dan salah satu masalah yang saya temukan adalah duplikasi nama folder dalam arsip, yaitu ketika mengompresi folder yang disebut "foo" arsip yang mengandung .\foo\fighters.txtdiproduksi bukan hanya satu yang mengandung fighters.txt.

Jawabannya, oleh karena itu pergi ke direktori yang sedang diproses dan memiliki arsip muncul di direktori (root) sebelumnya, kemudian kembali ke direktori itu untuk memproses folder berikutnya.

Juga penting untuk memiliki 7ZIP mengabaikan file ZIP dan CMD yang ada dalam direktori root untuk mencegah mereka berakhir dalam arsip, karenanya argumen -x!*.zipdan -x!*.cmdpengecualian.

Script ini juga akan mempertahankan struktur folder rekursif.

@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

Kode di atas harus disalin ke file batch seperti "compress_dirs.cmd" dan dijalankan sebagai admin dari direktori yang berisi folder yang ingin Anda kompres.

Semoga ini membantu.

Pi Hard
sumber
0

Jika Anda perlu menjaga struktur folder, dan menyimpan setiap file dalam strukturnya sendiri, coba ini:

Simpan perintah ini dalam file dengan ekstensi .bat dan letakkan di folder yang Anda perlu zip:

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

catatan:

-sdel: Menghapus file asli (opsional, jika Anda hanya ingin menyimpan file yang dikompresi)

cinta hidup
sumber