How to Zip Files and Directories in Linux

Zip is very useful utility to compress data to

  • Save disk space 
  • To transfer big files faster

Zip is also used to split files.

In Linux it is very easy to use zip utility. Lets install zip. In Centos do following...

sudo yum -y install zip

I got following message...

Package zip-3.0-11.el7.x86_64 already installed and latest version

If it is not installed then, it will be installed.

Lets check what are the options available for zip command

zip --help
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
Zip 3.0 (July 5th 2008). Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
  The default action is to add or replace zipfile entries from list, which
  can include the special name - to compress standard input.
  If zipfile and list are omitted, zip compresses stdin to stdout.
  -f   freshen: only changed files  -u   update: only changed or new files
  -d   delete entries in zipfile    -m   move into zipfile (delete OS files)
  -r   recurse into directories     -j   junk (don't record) directory names
  -0   store only                   -l   convert LF to CR LF (-ll CR LF to LF)
  -1   compress faster              -9   compress better
  -q   quiet operation              -v   verbose operation/print version info
  -c   add one-line comments        -z   add zipfile comment
  [email protected]   read names from stdin        -o   make zipfile as old as latest entry
  -x   exclude the following names  -i   include only the following names
  -F   fix zipfile (-FF try harder) -D   do not add directory entries
  -A   adjust self-extracting exe   -J   junk zipfile prefix (unzipsfx)
  -T   test zipfile integrity       -X   eXclude eXtra file attributes
  -y   store symbolic links as the link instead of the referenced file
  -e   encrypt                      -n   don't compress these suffixes
  -h2  show more help

There are lot of options that come with zip. We will start with the basics of zipping files and directories and touch upon few of these switches which one should know.

How to Compress a file in Linux

Lets compress a file first and see how it works

ls -lh credits.csv
-rw-rw-r-- 1 root root 182M Sep 21 10:29 credits.csv

As we see above the size of file is 182M. Lets compress it using zip and see what we get.

zip credits credits.csv
adding: credits.csv (deflated 76%)

deflated 76% means, file has been compressed by 76%. Lets check the size of file now

ls -lh credits.zip
-rw-rw-r-- 1 root root 44M Nov 29 02:02 credits.zip

There you go, size of file is 44M which is 24% of original size.

Lets try the switch -q quite operation. We should not see any message if we use this switch.

zip -q credits credits.csv

Yes we didn't see the deflated message.

Lets try the switch -1 according to the documentation it says compress faster but it compression is not as much, lets try that.

zip -1 credits credits.csv
updating: credits.csv (deflated 72%)

If you run above, you will see it runs relative faster but compression is only 72% as compared to 76% compression we got earlier.

There is another switch -9 which is used to compress better, so there should be relatively slower. Lets try that and see what is the compress we get.

zip -9 credits credits.csv
updating: credits.csv (deflated 77%)

Indeed the compression is marginally better 77% as compared to 76%.

Lets try -u switch now. Which updates only if file has changed. To see it we will have to time the operation.Lets try on our file and see what happens. 

time zip -u credits credits.csv
real	0m0.004s
user	0m0.000s
sys	0m0.000s

As we see above, it just finished instantly. it means zip didnt redo the operation since credits.csv not changed and we already had the credits.zip file present.

-v is to add more verbose information as shown below.

zip -vu credits credits.csv
zip diagnostic: credits.csv up to date

As we see above, I used both the switches together in the above command -u and -v. We got a message "zip diagnostic: credits.csv up to date" because of -v switch.

How to zip directory and its files in Linux

ls admin/
admin   controllers  jest.config.js  node_modules  package-lock.json  scripts
config  doc          LICENSE.md      package.json  README.md

Ok In the directory admin, as we can see there are some files and directories. Lets try to zip the whole directory admin using -r switch.

zip -qr admin admin
ls -lh admin.zip
-rw-r--r-- 1 root root 26M Nov 29 02:31 admin.zip

As we see above, admin.zip file has been created whose size is 26M. Lets preview the contents of this zip file without using the unzip command. We can do that either using less editor command or another utility which is zipinfo.

zipinfo -l admin.zip | head -5
Archive:  admin.zip
Zip file size: 27078266 bytes, number of entries: 1988
drwxr-xr-x  3.0 unx        0 bx        0 stor 19-May-01 21:53 admin/
-rw-r--r--  3.0 unx       72 tx       70 defN 19-May-01 21:52 admin/jest.config.js
drwxr-xr-x  3.0 unx        0 bx        0 stor 19-May-01 21:52 admin/controllers/

I am just printing out the first 5 file names in the zipped file just to show you guys that files have been zipped.

Lets try -d switch, this is used to delete entries in the zipped file. Lets try to delete the file admin/jest.config.js from the zipped file.

zip -d admin.zip "admin/jest.config.js"
deleting: admin/jest.config.js

There you go, we got the message that, file has been deleted. lets use zipinfo to see if it is still there.

zipinfo -l admin.zip | egrep 'jest.config.js' | wc -l 
0

Ok as wee see above, the file is not present in the admin.zip anymore.


Thats it for now. Hope the example of above commands will be helpful.