312

I have a project with lots of hidden folders / files in it. I want to create a zip-archive of it, but in the archive shouldn't be any hidden folders / files. If files in a hidden folder are not hidden, they should also not be included.

I know that I can create a zip archive of a directory like this:

zip -r zipfile.zip directory

I also know that I can exclude files with the -x option, so I thought this might work:

zip -r zipfile.zip directory -x .*

It didn't work. All hidden directories were still in the zip-file.

Martin Thoma
  • 19,277

8 Answers8

209

First of all if you don't have installed zip install it first as follows:

sudo apt-get install zip

Then for simply creating a zip file:

zip -r compressed_filename.zip foldername

If you want to exclude hidden files:

find /folder_path -path '*/.*' -prune -o -type f -print | zip ~/compressed_filename.zip -@

Excluding Files from a Zip Archive (taken from http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/)

The basics of file exclusion when creating a zip archive are centered around the -x flag, which is used to exclude files from the archive that match a specific name or pattern. At it’s most basic, it will look like this:

zip archive.zip files -x "ExcludeMe"

Meaning you could exclude a single file, say it’s named “Nothanks.jpg”

zip archive.zip images/ -x "Nothanks.jpg"

Let’s cover a few specific examples where this is useful.

Exclude .DS_Store Files from Zip Archives

This will prevent the typically invisible Mac metadata .DS_Store files from being included in a zip archive, which are bundled in by default:

zip -r archivename.zip archivedirectory -x "*.DS_Store"

If the directory includes subdirectories however, you’ll want to use another variation of that command to exclude the the ds_store files from subdirectories as well:

zip -r archive.zip directory -x "*/\.DS_Store"

Note: not all shells require the quotations for this command to work properly, but in the bash shell (the default for OS X) you will need to use the quotes for excluding with wildcards and patterns.

Exclude Specific File Types from a Zip Archive

With wildcards, you can also exclude all files of a certain type by focusing on the extension. For example, this command will zip an entire directory, minus any .jpg files:

zip -r archive.zip directory -x "*.jpg"

That could be modified for any specific file extension or pattern matched in a file name.

Exclude the .git or .svn Directory from a Zip Archive

Zip a directory, minus .git and it’s contents:

zip -r zipdir.zip directorytozip -x "*.git*"

Zip a folder, without including the .svn directory:

zip -r zipped.zip directory -x "*.svn*"

Exclude All Hidden Files from a Zip Archive

Since patterns and wildcards can be used, you could also exclude any or all invisible files and folders that are made so by being prefixed with a period, whether it’s a directory like .svn or an individual file like .bash_profile or .htaccess.

zip -r archivename.zip directorytozip -x "*.*"

Or to exclude all invisible files from all subdirectories:

zip -r archive.zip directory -x "*/\.*"
terdon
  • 100,812
M.A.K. Ripon
  • 3,139
  • 6
    Thank you for your effort to help a fellow Ubuntu user. Please keep in mind that re-stating the accepted answer in a new answer just adds to the clutter and has a high probability of being flagged for removal. – hmayag Aug 11 '15 at 07:04
  • I don't understand why the question has more upvotes than this very thorough answer – Nathan majicvr.com Sep 15 '21 at 20:54
127

This also excludes hidden files in unhidden directories:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@
arrange
  • 14,959
  • 5
    Thanks for your answer. The command (find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) is longer than expected, but it works fine. Subdirectories are also included, so +1 and an accepted answer :-) – Martin Thoma Aug 28 '11 at 09:17
62

Add " to the .* (otherwise, your shell expands .* to the dot files in the current directory), and also exclude hidden files in subdirectories:

zip -r zipfile.zip . -x ".*" -x "*/.*"

This will result in files starting with a . not to be added into your zip file.

rinzwind@discworld:~/tmp$ ls -la
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 tmp
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 .tmp
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x .*
adding: .tmp/ (stored 0%)
adding: tmp/ (stored 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
updating: tmp/ (stored 0%)
Rinzwind
  • 299,756
12

Example for excluding all folders begining with . :

tar cvpzf folder.tgz folder/ --exclude '.*'

Better compress but slower :

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'
AzkerM
  • 10,270
  • 6
  • 32
  • 51
Tigrouzen
  • 119
  • 1
  • 4
11

This one includes all "." directories, subdirectories, and "." files or directories within directories... Essentially the first answer but includes top level "." files.

find /full_path -path '*.*/.*' -prune -o -type f -print | zip ~/file.zip -@
cosimnot
  • 111
9

The correct method would be:

zip -r zipfile.zip directory -x directory/.*
jobin
  • 27,708
7

While zipping dirs excluding some file extension:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"
Kerem
  • 686
  • 9
  • 13
7

Without hidden folders and files in directory:

zip -r zipfile.zip directory/*

directory:

|── .git
│   
├── src
│   └── Work.file
├── .test
│   └── .file
└── test.file
$ zip -r zipfile.zip directory/*
adding: directory/src/ (stored 0%)
adding: directory/src/Work.file (stored 0%)
adding: directory/test.file (stored 0%)
Zanna
  • 70,465