Reputation: 40227
When I compress files with the built in zip compressor in Mac OSX, it causes an extra folder titled "__MACOSX" to be created in the extracted zip.
Can I adjust my settings to keep this folder from being created or do I need to purchase a third party compression tool?
UPDATE: I just found a freeware app for OSX that solves my problem: "YemuZip"
UPDATE 2: YemuZip is no longer freeware.
Upvotes: 279
Views: 215410
Reputation: 3469
Cleanup .zip from .DS_Store
and __MACOSX
, including subfolders:
zip -d archive.zip '__MACOSX/*' '*/__MACOSX/*' .DS_Store '*/.DS_Store'
Walkthrough:
zip
in the Terminal (but don't hit enter)-d '__MACOSX/*' '*/__MACOSX/*' .DS_Store '*/.DS_Store'
zipinfo archive.zip
to list files inside to check (optional)Upvotes: 11
Reputation: 32221
This command did it for me:
zip -r Target.zip Source -x "*.DS_Store"
Target.zip
is the zip file to create. Source
is the source file/folder to zip up. The -x
parameter specifies the file/folder to exclude.
If the above doesn't work for whatever reason, try this instead:
zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
Upvotes: 48
Reputation: 1466
I have a better solution after read all of the existed answers. Everything could done by a workflow in a single right click. NO additional software, NO complicated command line stuffs and NO shell tricks.
The automator workflow:
Input: files or folders from any application.
Step 1: Create Archive, the system builtin with default parameters.
Step 2: Run Shell command, with input as parameters. Copy command below.
zip -d "$@" "__MACOSX/*" || true
zip -d "$@" "*/.DS_Store" || true
Save it and we are done! Just right click folder or bulk of files and choose workflow from services menu. Archive with no metadata will be created alongside.
IMAGE UPDATE: I chose "Quick Action" when creating a new workflow - here’s an English version of the screenshot:
Upvotes: 7
Reputation: 22016
Can be fixed after the fact by zip -d filename.zip __MACOSX/\*
And, to also delete .DS_Store
files: zip -d filename.zip \*/.DS_Store
Upvotes: 460
Reputation: 20336
When I had this problem I've done it from command line:
zip file.zip uncompressed
EDIT, after many downvotes: I was using this option for some time ago and I don't know where I learnt it, so I can't give you a better explanation. Chris Johnson's answer is correct, but I won't delete mine. As one comment says, it's more accurate to what OP is asking, as it compress without those files, instead of removing them from a compressed file. I find it easier to remember, too.
Upvotes: 135
Reputation: 21
Another shell script that could be used with the Automator tool (see also benedikt's answer on how to create the script) is:
while read -r f; do
d="$(dirname "$f")"
n="$(basename "$f")"
cd "$d"
zip "$n.zip" -x \*.DS_Store -r "$n"
done
The difference here is that this code directly compresses selected folders without macOS specific files (and not first compressing and afterwards deleting).
Upvotes: 0
Reputation: 1256
Inside the folder you want to be compressed, in terminal:
zip -r -X Archive.zip *
Where -X means: Exclude those invisible Mac resource files such as “_MACOSX” or “._Filename” and .ds store files
Note: Will only work for the folder and subsequent folder tree you are in and has to have the *
wildcard.
Upvotes: 109
Reputation: 161
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
-x "*/\__MACOSX"
: ignore __MACOSX as you mention.-x "*/\.*"
: ignore any hidden file, such as .DS_Store .Also, you can build Automator Service to make it easily to use in Finder. Check link below to see detail if you need.
Upvotes: 16
Reputation: 1999
I'm using this Automator Shell Script to fix it after. It's showing up as contextual menu item (right clicking on any file showing up in Finder).
while read -r p; do
zip -d "$p" __MACOSX/\* || true
zip -d "$p" \*/.DS_Store || true
done
Upvotes: 22
Reputation: 66
This is how i avoid the __MACOSX
directory when compress files with tar
command:
$ cd dir-you-want-to-archive
$ find . | xargs xattr -l # <- list all files with special xattr attributes
...
./conf/clamav: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55
./conf/global: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55
./conf/web_server: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55
Delete the attribute first:
find . | xargs xattr -d com.apple.quarantine
Run find . | xargs xattr -l
again, make sure no any file has the xattr attribute. then you're good to go:
tar cjvf file.tar.bz2 dir
Upvotes: 0
Reputation: 718
do not zip any hidden file:
zip newzipname filename.any -x "\.*"
with this question, it should be like:
zip newzipname filename.any -x "\__MACOSX"
It must be said, though, zip command runs in terminal just compressing the file, it does not compress any others. So do this the result is the same:
zip newzipname filename.any
Upvotes: 2
Reputation: 693
The unwanted folders can be also be deleted by the following way:
zip -d filename.zip "__MACOSX*"
Works best for me
Upvotes: 16
Reputation: 2256
You can't.
But what you can do is delete those unwanted folders after zipping. Command line zip
takes different arguments where one, the -d
, is for deleting contents based on a regex. So you can use it like this:
zip -d filename.zip __MACOSX/\*
Upvotes: 9
Reputation: 8923
The zip
command line utility never creates a __MACOSX
directory, so you can just run a command like this:
zip directory.zip -x \*.DS_Store -r directory
In the output below, a.zip
which I created with the zip
command line utility does not contain a __MACOSX
directory, but a 2.zip
which I created from Finder does.
$ touch a
$ xattr -w somekey somevalue a
$ zip a.zip a
adding: a (stored 0%)
$ unzip -l a.zip
Archive: a.zip
Length Date Time Name
-------- ---- ---- ----
0 01-02-16 20:29 a
-------- -------
0 1 file
$ unzip -l a\ 2.zip # I created `a 2.zip` from Finder before this
Archive: a 2.zip
Length Date Time Name
-------- ---- ---- ----
0 01-02-16 20:29 a
0 01-02-16 20:31 __MACOSX/
149 01-02-16 20:29 __MACOSX/._a
-------- -------
149 3 files
-x .DS_Store
does not exclude .DS_Store
files inside directories but -x \*.DS_Store
does.
The top level file of a zip archive with multiple files should usually be a single directory, because if it is not, some unarchiving utilites (like unzip
and 7z
, but not Archive Utility, The Unarchiver, unar
, or dtrx
) do not create a containing directory for the files when the archive is extracted, which often makes the files difficult to find, and if multiple archives like that are extracted at the same time, it can be difficult to tell which files belong to which archive.
Archive Utility only creates a __MACOSX
directory when you create an archive where at least one file contains metadata such as extended attributes, file flags, or a resource fork. The __MACOSX
directory contains AppleDouble files whose filename starts with ._
that are used to store OS X-specific metadata. The zip
command line utility discards metadata such as extended attributes, file flags, and resource forks, which also means that metadata such as tags is lost, and that aliases stop working, because the information in an alias file is stored in a resource fork.
Normally you can just discard the OS X-specific metadata, but to see what metadata files contain, you can use xattr -l
. xattr
also includes resource forks and file flags, because even though they are not actually stored as extended attributes, they can be accessed through the extended attributes interface. Both Archive Utility and the zip
command line utility discard ACLs.
Upvotes: 7
Reputation: 90671
Do you mean the zip
command-line tool or the Finder's Compress command?
For zip
, you can try the --data-fork
option. If that doesn't do it, you might try --no-extra
, although that seems to ignore other file metadata that might be valuable, like uid/gid and file times.
For the Finder's Compress command, I don't believe there are any options to control its behavior. It's for the simple case.
The other tool, and maybe the one that the Finder actually uses under the hood, is ditto
. With the -c -k
options, it creates zip archives. With this tool, you can experiment with --norsrc
, --noextattr
, --noqtn
, --noacl
and/or simply leave off the --sequesterRsrc
option (which, according to the man page, may be responsible for the __MACOSX
subdirectory). Although, perhaps the absence of --sequesterRsrc
simply means to use AppleDouble format, which would create ._ files all over the place instead of one __MACOSX
directory.
Upvotes: 1