Zipping files on Apple/Mac is a chore because of all the hidden files and folders added by macOS. Like
__MACOSX are two of the most common files and folders that are added to zip files when compressed on macOS.
The folder named
__MACOSX especially is problematic because it contains duplicates of every file in the zip archive. So for example, if you use Finder to compress 20 files, the resulting zip file will contain the original 20 files, plus an additional 20 files all hidden under the
It’s a real pain and can be confusing to deal with because when you unzip the files on a Mac, the hidden files and folders are not included in the unzipped files. So you won’t be able to view them, even after you enable display of hidden files. The only way to view all the hidden files/folders is to open the zip file on a non-Mac machine, like PC/Windows or Linux.
Here are some screenshots showing the hidden files and folders that are included for any folder compressed (zipped) on macOS. First screenshot shows the hidden
__MACOSX directory, which is visible on PC when you open the zip file.
The next screenshot shows the set of duplicate files and folders that are included in zip files compressed on macOS. Notice the file names, each begin with a dot
., which makes the files hidden by default on most systems.
Now compare those previous screenshots (taken on PC) with the following screenshot (taken on Mac). Even with “show hidden files” enabled, the hidden
__MACOSX folder and all the hidden files are not included (i.e., they do not exist hidden or otherwise) in the unzipped archive.
So again, all the hidden files/folders added by Mac are included in the unzipped files ONLY when the files are unzipped on non-Mac machines. Thus the confusion: Why on earth are the hidden files added in the first place? They are completely excluded when unzipping on Mac, and never needed for any reason on any other machine. In fact quite the opposite: the hidden files serve NO purpose other than to waste bandwidth, time, energy, resources, etc.
Why does macOS include hidden files in zip archives? It makes absolutely zero sense.
This is a real problem because many people use Mac to zip files to share on the Web. Problem is that not everyone uses a Mac. So anyone downloading your zip files on their Windows, Linux, or other non-Mac is going to see all those hidden files and folders. Which are utterly useless to non-Mac devices and users.
Further, by adding a duplicate set of hidden files to the zip archive, Mac essentially is doubling the size of the download zip file, which of course wastes bandwidth, disk space, and everything else. May not be a huge deal for smaller zip files, but we’re talking about potentially millions or billions of zip files downloaded every day, needlessly bloated with useless data.
__MACOSXdirectory and its duplicate set of files can cause problems with things like installing WordPress plugins and other applications. So if you are WordPress/Web developer, use a version-control system to manage and package/zip your files. That way you keep all the hidden junk completely out of the picture. Alternately if you aren’t using version control, you can remove/exclude unwanted hidden files using one of the techniques below.
Fortunately, all the hidden garbage is not needed on any machine — including Mac — so it’s all 100% totally safe to delete. So regardless of which machine/OS you are using, you can safely delete
.DS_Store from any zip archive. The files literally are useless. Read on to learn some different techniques for removing the
.DS_Store from ZIP Files on macOS.
Use software to exclude hidden files from NEW zip archives
For new files, you can use an app such as YemuZip or any free alternative to zip compress new files without any hidden junk.
I don’t know of any apps that can retroactively remove hidden files/folders from existing zip files. If you know of any, drop a comment or send via contact form.
Use command line to exclude hidden files from NEW zip archives
On Mac you can use Terminal to easily remove all of the hidden files/folders from existing zip files. Here are some techniques that I use for my own projects.
When creating new ZIP archives, you can use the
zip command to compress/zip files without any hidden files like
__MACOSX. Here are the steps:
- Open the Terminal app
- Navigate to the folder that contains the files you want to zip
- Type or paste the following command into Terminal*:
zip -r data.zip . -x ".*" -x "__MACOSX"
- Press Enter to execute and done.
The resulting zip archive will be named
data.zip and located in the same directory as the original uncompressed files. The
data.zip archive will not include any
__MACOSX or “dot-hidden” files (i.e., file names that begin with a literal dot).
*Important: The above command will remove all dot-hidden files, including files like .htaccess and other common/useful files. So if you want to keep some hidden files and only remove the ones added by macOS, use this command instead:
zip -r data.zip . -x ".DS_Store" -x "__MACOSX"
lscommands to navigate in Terminal.
To give this a real-world example. Let’s say you have a folder on your desktop called
Folder that includes a bunch of files that you want to zip/compress.
First, open terminal and write following commands:
cd ~/Desktop/Folder zip -r data.zip . -x ".DS_Store" -x "__MACOSX"
Now you have a file called
data.zip on your desktop that does not include any
.DS_Store files. I.e., a nice clean zip file with no hidden garbage.
Use command line to remove hidden files from EXISTING zip archives
The above techniques show how to exclude hidden files when creating new zip archives. But what if you want to remove hidden files from an existing zip archive? Easy. In Terminal, navigate to the directory that contains your zip file and enter the following two commands:
zip -d data.zip "__MACOSX/*" zip -d data.zip "*/.DS_Store"
And/or if you have multiple zip archives in some folder, and want to remove all hidden macOS files from all of them in bulk. Use Terminal to navigate to the folder and enter the following commands:
for f in *.zip; do zip -d "$f" "__MACOSX/*"; done for f in *.zip; do zip -d "$f" "*/.DS_Store"; done
I use this technique for zip files I serve here at Perishable Press and elsewhere.
For a “quieter” Terminal experience, you can add the
q (quiet) or
for f in *.zip; do zip -qd "$f" "__MACOSX/*"; done for f in *.zip; do zip -qd "$f" "*/.DS_Store"; done