7-Zipping multiple folders to separate/individual zip/archive files
So I thought I would write this solution up as I had already made a batch file to do this then promptly deleted it (subsequently Recuva couldn’t ‘recuva’ it, as I’d been throwing a lot of data on and off my PC and thus I assume it was over-written). The problem was I had several folders I wanted to zip into individual 7z archives. 7-zip lacks a ‘Add to “*.7z”‘ explorer context for multiple selected files or folders (even though it does include a ‘Extract to “*\”‘). Nor does this option appear within the application itself or via the command-line. I seem to recall this feature being available in the Explorer contexts for some ZIP program I once used (I think it was TUGzip), but I wanted to choose quite aggressive compression settings for the archives and I didn’t think this would be achievable except via the command-line.
So using a bit of Google skills I discovered the ‘for… in… do’ batch command. Which is quite powerful and I’m sure will come in handy again now that I know about it. For more information check out this guide: More Powerful Batch Files Part II – Iterating with “For”. Coupled with the 7-zip manual I arrived at a batch file with this line in it:
for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.7z" "%%X\" -mx=9 -ms=on -md=26 -mfb=256
So copy that into a batch file, copy it to the directory where you have folders you want to zip to individual archives and run it. You might want to change (or just delete) the custom settings (e.g. the settings with -m at the end) as it set up to do some pretty heavy compression which does take quite a long time (but of course you can leave it running in the background without too much problem).
thanks, worked a treat!
Awesome, what I was looking for, such a shame 7-z didn’t integrate this in the context menu. You saved me a lot of time, thanks
Thanks!
you just saved me a couple of hours of finding out how to write that little script.
Looks like you are a true pro. Did you study about the theme? haha..
In case there is error while running the command, try to eliminate a “%” and the command may work for you again.
e.g.
for /d %X in (*) do “c:\Program Files\7-Zip\7z.exe” a “%X.7z” “%X\” -mx=9 -ms=on -md=26 -mfb=256
Great! Worked like a charm. Saved me hours of work. Thanks!
Thanks !
It worked like a charm 😉
Thanks a lot!!
Thanks, I was searching for something similar to work with multiple files instead of directories, just had to modify your script a bit and it works great!
for %%X in (*.pdf) do “C:\Program files\7-Zip\7z.exe” a “%%X.7z” “%%X” -mx=9
Thanks again!
Thanks a lot, works like a charm.
By the way, I modified it this way
for /d %%X in (*) do “C:\Program Files\7-Zip\7z.exe” a “%%X.zip” “.\%%X\*”
* It creates zip instead of 7z
* Contents of each folder is compressed instead of compressing the folder itself.
Works like a charm. Thank you.
Ok so what corrections would I need to do to this scrip to have it compress using LZMA2 Dictionary Size=128MB, Word Size=273?
Thanks in advance for this help 🙂 this scrip did save me a lot of time and effort.
I’m sorry me again 😦 what would I need to add to have the files automatically split say like every 50mb?
Hi Kyle. Not too sure. Check this page out: http://www.dotnetperls.com/7-zip-examples – might be useful!
I need to compress all the files in a directory into its own 7z file. I tried
for %%X in (*.*) do “C:\Program files\7-Zip\7z.exe” a “%%X.7z” “%%X” -mx=9,
but it did nothing. The folder way works great!
Any other way to do what I need?
Use this instead:
for /f “tokens=*” %%G in (‘dir /A:-D /b’) do “c:\Program Files\7-Zip\7z.exe” a “%%G.7z” “%%G” -mx=9 -ms=on -md=26 -mfb=256
The “/A:-D” means directories are not included. The “tokens=*” means long names don’t break the script.
thanks, that works well!
I want to create a ZIP files instead of .7zip so i added the -tzip into the script but it doesnt work, any ideas?
for /d %%X in (*) do “c:\Program Files\7-Zip\7z.exe” a -tzip “%%X.zip” “%%X\” -mx=9 -ms=on -md=26 -mfb=256
That is what i used.
Maybe try without the extra switches, i.e. try without the “-mx=9 -ms=on -md=26 -mfb=256”.
Works great for me, thank you very much! In case anyone is interested, here is the one I am using, which does zero compression and uses a zip file (so it can be opened in Windows Explorer), and includes the contents of the folder rather than the folder itself (thank you theclubpenguineherald!)
for /d %%X in (*) do “c:\Program Files\7-Zip\7z.exe” a -tzip “%%X.zip” “.\%%X\*” -mx0
Hi, already copied it to my batch file, but it doesn’t work. do you have any clue?
i just copy-paste your code to my file and the command prompt window only flashes..
for /d %%X in (*) do “c:\Program Files\7-Zip\7z.exe” a -tzip “%%X.zip” “.\%%X\*” -mx0
please help, i need to compress a whole lot of images stored in multiple (and a lot) of folders, to make it easy when i need to move them around..
I tried it as well and it didn’t work. There’s something wrong with that script.
The correct script to compress every folder into individual zips is:
for /d %%X in (*) do “c:\Program Files\7-Zip\7z.exe” a “%%X.zip” “%%X\”
Hope this helps!
Once I’ve created multiple individual .zip files in a folder, is there a way to batch process these same files to be .exe files that when executed will be placed to the same come file folder location? Any help would be appreciated. Thanks
Hi! Do you mean you want to combine all of the 7z files into an exe file? You could include something like this in your script:
“c:\Program Files\7-Zip\7z.exe” a -sfx files.exe *.zip
This is a great article! One other thing to note is if you want to store the batch file in a folder with all your other batch files 7zip let’s you change the directory your are archiving the batch command “cd”. Also you can put your 7zip command line utility at a different pat as well.
cd /D C:\Users\User\Music
for /d %%X in (*) do C:\Batch\7za920\7za.exe a “%%X.7z” “%%X\” -y -mx9 -mmt -we:\temp
thanks… it really worked..
I have over a million of files (about 200 GB of data) and I would like to back them up to the cloud on a daily basis. The fact that there are so many files it makes it impossible and I was looking for a solution where I compress each folder to an individual file before uploading. I found this script that I use it successfully to do so. But there are 2 considerations.
Update the archive ONLY when there are file changes inside the directory (new files, updated files, and deleted files)
1. I would like the output file NOT to change date of creation if there are no file changes inside the directory.
Here is the script I used but it needs some expanding based in what is the objective.
for /d %%X in (\Temp*) do “c:\Program Files\7-Zip\7z.exe” u “%%X.zip” “%%X\”
I appreciate any help on that…
Peter
Hi Peter. I think your requirements might require a more complicated script or an alternative like rsync (or whatever a Windows equivalent of that).
Perhaps something easier to set-up like https://freefilesync.org/ might be an option?
thank ou this helped much
You’re welcome!
Hey, James. Hopefully, you are still replying to messages here. I was wondering if there was a way to 7z all contents of each folder into an archive without including the folder itself.
For example, I have temp1, temp2, temp3 etc folders each with files in it. I want the batch to 7z the contents of each folder without including the “temp1” etc folders in the archive. Is this possible?
I should specify I want the contents of each folder zipped individually into separate archives just like your original script only without the folder included in each archive.
Hi Mike. I believe you would just add an asterisk in a key location, so `”%%X\”` becomes `”%%X\*”`. Altogether that would be: `for /d %%X in (*) do “c:\Program Files\7-Zip\7z.exe” a “%%X.7z” “%%X\*” -mx=9 -ms=on -md=26 -mfb=256` — make sure you remove the back ticks, though!
I am basing this on the answer found here which just pulls from the manual itself! https://superuser.com/a/340062
Looking at that site, there are slight differences when excluding the subdir prefix there. It has it like .\subdir\* instead of just subdir\*, so the correct way would be this:
for /d %%X in (*) do “c:\Program Files\7-Zip\7z.exe” a “%%X.7z” “.\%%X\*” -mx=9 -ms=on -md=26 -mfb=256
I just tried it and it works! Thanks for the help! You have to write it like .\%%X\* as just putting a * there still includes the subdir.
Really it is awesome -all about programming, but when you get a situation which you want to solve asap, but it’s complex problem all about a LOT of varieties of options and what can go wrong – mistakes, bugs and headache. At this moment my head start spinning.
I’ve found accidentally solution on other webpage:
it’s Total Commander!
(https://superuser.com/questions/311937/how-do-i-create-separate-zip-files-for-each-selected-file-directory-in-7zip)
It’s simple and awesome. And by the way, where I can “batch pack files” (read further as “put into archive files and folder in one task” or “mass zipping”) separately (like this in any archive format “abc.txt” into “abc.zip”, folder “docs” into “docs.zip”, or “calc.exe” into “calc.zip”). But better part of Total Commander is option to put one “strong password” for large amount archived files and folders – it’s useful to upload and share some private or not documents.