Unix zip directory but excluded specific subdirectories (and everything within them)

229,018

Solution 1

I was so close!

The actual command I need is:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*

Solution 2

For my particular system in order to exclude a directory I had to put quotes around my excluded directories and it worked like a charm:

zip -r myarchive.zip dir1 -x "dir1/ignoreDir1/*" "dir1/ignoreDir2/*"

Notes:

-- this excluded both the directory to exclude and all files inside it.

-- You must use the full path to the directories you want to exclude!

Solution 3

@sulman using:

     zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*

will still include dir1/ignoreDir1/ empty folder in the zip archive, using:

     zip -r myarchive.zip dir1 -x dir1/ignoreDir1** dir1/ignoreDir2**

will do the trick, you can also use a leading ** to search in subfolders instead of only dir1

Solution 4

The following will do

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1/ignoreDir2\*

What did you need the ** for, @sulman?

It works like a charm for me as follows:

[root@ip-00-000-000-000 dir1]# ls -lrt dir1/ 
total 16
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir1
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir2
drwxr-xr-x 2 root root 4096 Oct 31 07:39 dir3
-rw-r--r-- 1 root root    8 Oct 31 07:39 test.txt

[root@ip-00-000-000-000 temp]# zip -r dir1.zip dir1 -x dir1/ignoredir1\* dir1/ignoredir2\*
  adding: dir1/ (stored 0%)
  adding: dir1/dir3/ (stored 0%)
  adding: dir1/dir3/test3.txt (deflated 13%)
  adding: dir1/test.txt (stored 0%)

Solution 5

In Ubuntu Server this commands works for zip a file excluding some folders, but with a little differences:

If you wanna zip without keep empty folders:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*

If you wanna zip keep empty folders:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1/ignoreDir2\*

By example:

zip -r testtt.zip uploads/2013/ -x uploads/2013/03/**\* uploads/2013/04/**\*
zip -r testtt.zip uploads/2013/ -x uploads/2013/03\* uploads/2013/04\*
Share:
229,018

Related videos on Youtube

sulman
Author by

sulman

Certified Magento Developer. Living the coding dream.

Updated on September 18, 2022

Comments

  • sulman
    sulman almost 2 years

    I'm trying to zip a directory (on Unix via SSH) but I need to exclude a couple of subdirectories (and all files and directories within them).

    So far I have this:

    zip -r myarchive.zip dir1 -x dir1/ignoreDir/**/* 
    

    That doesn't seem to work though.

    I also tried

    zip -r myarchive.zip dir1 -x dir1/ignoreDir1/* dir1/ignoreDir2/*
    

    However that will still include subdirectories within ignoreDir1 and ignoreDir2.

    The subdirectory structure in the directories that I want to exclude is quite substantial so I can't simply add each directory to the -x argument.

    Does anyone know how to do this?

    • jww
      jww over 6 years
      @AlexanderMills - See this question.
  • sulman
    sulman almost 12 years
    I don't know why the ** is needed. Maybe someone else can shed some light on this?
  • ericn
    ericn over 11 years
    Sorry, @sulman, I typed wrongly. What I meant is as per my latest edit. Works a like a charm for me :)
  • sulman
    sulman over 10 years
    Ah ok! Thanks for shedding the light on this!
  • G-Man Says 'Reinstate Monica'
    G-Man Says 'Reinstate Monica' over 9 years
    Surely the backslash between dir1 and ignorDir2 is meant to be a forward slash. Do you mean for the other backslashes to be backslashes? If you do, then you have just copied fuzzybee's answer from two years ago.
  • rynop
    rynop over 9 years
    This did not work for me on osx. @pathfilder answer did though.
  • physicalattraction
    physicalattraction about 9 years
    This is the one that works on Mac OS. :-)
  • zagrimsan
    zagrimsan over 8 years
    How does this differ from the solution by Rick Ehrahrt a year ago, or Eric's (a few more years ago)? Please do read the provided solutions before posting a new one...
  • zagrimsan
    zagrimsan over 8 years
    As nobody has explained the reason for requiring either quoting the paths or escaping the asterisk, the reason is this: If the path is not quoted or the wildcard escaped, the shell will perform wildcard expansion before passing them to zip, which will receive a list of paths to entries in the specified directories, but not paths to files within subdirectories of those, thus causing zip to not to ignore everything under the given directories.
  • Francisco M
    Francisco M over 8 years
    Because I added a backslash before the asterisk (that is to escape the asterisk). In the linux version at my work doesn't work if i don't do that.
  • zagrimsan
    zagrimsan over 8 years
    Also Rick Ehrahrt (2014) and eric (2012) posted the same solution (to escape the asterisk). There's nothing wrong with the solution, but posting the same one multiple times doesn't make sense unless one can significantly add depth to the solution by explaining why the solution works. In a simple case like this, there's nothing to be explained more. Please don't take this personally, my only intention here is to help in keeping SU clean and concise so users can find the best solution with the least effort.
  • Richard Gomes
    Richard Gomes over 8 years
    Instead of this: -x dir1/ignoreDir1/**\*, you can do this: -x dir1/ignoreDir1/\*
  • orangejsx
    orangejsx over 6 years
    I think originally one of the reasons this worked was because on Mac OS there were spaces in my directories and this avoided needing a \
  • Synetech
    Synetech about 5 years
    Thank you for clearing things up @zagrimsan. That both fixed the problem and explained the reason for it so that we understand it (which will also come in handy in the future for other things). 👍
  • Cazuma Nii Cavalcanti
    Cazuma Nii Cavalcanti over 4 years
    Relative paths works for me
  • AhmadKarim
    AhmadKarim about 3 years
    This worked for me zip -r theme.zip ./theme -x ./theme/node_modules/\*
  • Yashank
    Yashank about 3 years
    @AhmadKarim exactly what I needed for node_modules :)
  • Ashish Sharma
    Ashish Sharma almost 3 years
    In my case below cmd work: zip -r my-app.zip . -x "documentation/*" ".git/*"
  • Hermann Schwarz
    Hermann Schwarz almost 3 years
    On MacOS I was successful with: zip -r theme.zip theme -x theme/node_modules/\* or zip -r theme.zip theme -x "theme/node_modules/*"