command to zip multiple directories into individual zip files
You can use this loop in bash
:
for i in */; do zip -r "${i%/}.zip" "$i"; done
i
is the name of the loop variable. */
means every subdirectory of the current directory, and will include a trailing slash in those names. Make sure you cd
to the right place before executing this. "$i"
simply names that directory, including trailing slash. The quotation marks ensure that whitespace in the directory name won't cause trouble. ${i%/}
is like $i
but with the trailing slash removed, so you can use that to construct the name of the zip file.
If you want to see how this works, include an echo
before the zip
and you will see the commands printed instead of executed.
Parallel execution
To run them in parallel you can use &
:
for i in */; do zip -0 -r "${i%/}.zip" "$i" & done; wait
We use wait
to tell the shell to wait for all background tasks to finish before exiting.
Beware that if you have too many folders in your current directory, then you may overwhelm your computer as this code does not limit the number of parallel tasks.
Related videos on Youtube
Evster
Updated on September 18, 2022Comments
-
Evster over 1 year
I have a single directory that contains dozens of directories inside of it.
I'm new to command line and I'm struggling to come up with a command that will zip each sub-directory into a unique sub-directory.zip file.
So in the end my primary directory will be filled with all of my original sub-directories, plus the corresponding
.zip
files that contain the zipped up content of each sub-directory.Is something like this possible? If so, please show me how it's done.
-
lynxlynxlynx about 11 yearsI suggest you look up how "for loops" can be done in the shell. There are onliners that can do what you want, but a nice loop will be much clearer.
-
Evster about 11 yearsSo does that mean I need to write a separate shell script, and then call that script from the command line? Sorry for such an elementary question. Although I do have some programming experience this stuff is new to me.
-
-
Evster about 11 yearsThanks this looks great! However one potential problem I thought of: will this zip ALL directories within each sub-directory into separate files? I only want to zip the 1st-level subdirectories as single compressed files. I don't want to create additional zip files for 2nd-level, 3rd-level sub-directories, etc... Please let me know if that makes sense. Thanks again!
-
lynxlynxlynx about 11 yearsOnly the first level ones like you requested.
-
Evster about 11 yearsUPDATE: I tested it out and it appears to function the way that I want it to (i.e - only zipping 1st-level sub-directories into individual zip files).
-
Evster about 11 yearsYou are the man! This is going to be such a great time-saver. Consider this question answered. Thank you!
-
Nux over 7 yearsTo zip both files and subdirectories into individual archives just use:
for i in *; do zip -r "${i%}.zip" "$i"; done
-
fritzmg almost 6 yearsWill this include hidden files of the subdirectories?
-
MvG almost 6 years@fritzmg: A local test on my Linux suggests that yes, files starting in a dot are included. This would be a property of the Info-ZIP tool, not of the command I gave, so depending on what your
zip
binary is you might get different behavior. In order to also create zip files for top level directories (i.e. children of current directory) starting with a dot, you could useshopt -s dotglob
to make glob patterns match hidden files as well. -
chris over 5 yearsTo create a zip which doesn't have the parent directory as its root:
for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done