On Unix, the common zip command used to compress a folder is:
zip -r <zip_file_name>.zip <directory_name>
However, sometimes we might require an option to zip the directory by excluding few sub-directories, especially the ones with huge size and are not required. One easy workaround is to zip normally, extract and then delete the undesired sub-directories. But if the zipped file has to be transferred to other machine, size matters. This was in fact the context where I required it.
So jumping to the required command for this task:
zip -r <zip_file_name>.zip <directory_name> -x <directory_name>/<undesired_sub_directory1_name>\* <directory_name>/<undesired_sub_directory2_name>\* <directory_name>/<undesired_file_name>
Eg:
Lets say there’s a ‘test’ directory with 1,2,3,4,5 sub-directories (with some files in them) and files abc.txt and xyz.txt
$ zip -r test.zip test
The above command compresses the entire test directory and upon extraction all the sub-folders and files can be observed.
With exclusion:
$ zip -r test.zip test -x test/1\* test/3\* test/abc.txt
adding: test/ (stored 0%)
adding: test/2/ (stored 0%)
adding: test/2/2.txt (stored 0%)
adding: test/4/ (stored 0%)
adding: test/4/4.txt (stored 0%)
adding: test/5/ (stored 0%)
adding: test/5/5.txt (stored 0%)
adding: test/xyz.txt (stored 0%)
This command forms test.zip by excluding 1,3 sub-directories and the file abc.txt. Upon extraction, only 2,4,5 sub-directories and xyz.txt are available.
$ unzip test.zip
Archive: test.zip
creating: test/
creating: test/2/
extracting: test/2/2.txt
creating: test/4/
extracting: test/4/4.txt
creating: test/5/
extracting: test/5/5.txt
extracting: test/xyz.txt
Please note that for exclusion of sub-directories, its the backward slash ‘\’ followed by * at the end of each sub-directory exclusion.