Compress directories from the command line, excluding node_modules and development files

This simple article provides a CLI command to compress a directory whilst excluding specific sub-directories and files.

We do a lot of custom development using modern development tools. From time-to-time we need to compress certain directories for deployment to production. In such cases, it is very common that some files and sub-directories need to be excluded, typically node_modules directories and .git</code, <code>.lock and .idea files.

Here’s a typical command that I use:

zip -r [source_dir].zip [zipped_dir] -x "*/.*" "*/.idea/*" "*.lock" "*/node_modules/*" "*/resources/assets/*"

This command zips the source excluding the specified file types and sub-directories. I’ll break it down:

zip – the command to compress to the zip format

-r – recursively compress sub-directories

[source_dir] – the directory to compress

[zipped_dir] – the compress (zipped, archived) file, containing the directory

-x – the exclude flag, items listed after this will be excluded

"*/.*" – exclude all hidden files

"*/.idea/*" – exclude all files in the hidden directories called .idea (this are IDE files)

"*.lock" – exclude all files with the lock extension

"*/node_modules/*" – exclude all node_modules directories

"*/resources/assets/*" – exclude all assets directories that reside directly inside resources directories

I hope this serves are a useful starting point for anyone out there that is looking for a clean way to compress the contents of a directory, whilst excluding some of its contents.


If you are using git you can make use of its .gitignore file to export the directory whilst excluding anything that’s being ignored in the .gitignore file(s), such as:

git archive -o HEAD – exports the contents of the latest branch to a zipped file