Mac zip compress without __MACOSX folder?

后端 未结 14 1489
有刺的猬
有刺的猬 2020-12-07 06:53

When I compress files with the built in zip compressor in Mac OSX, it results in an extra folder titled \"__MACOSX\" created in the extracted zip.

Can I adjust my se

相关标签:
14条回答
  • 2020-12-07 07:17

    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
    
    0 讨论(0)
  • 2020-12-07 07:22

    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.

    0 讨论(0)
  • 2020-12-07 07:23

    Can be fixed after the fact by zip -d filename.zip __MACOSX/\*

    0 讨论(0)
  • 2020-12-07 07:23

    The unwanted folders can be also be deleted by the following way:

    zip -d filename.zip "__MACOSX*"
    

    Works best for me

    0 讨论(0)
  • 2020-12-07 07:25

    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. And the _x parameter specifies the file/folder to not include. If the above doesn't work for whatever reason, try this instead:

    zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
    
    0 讨论(0)
  • 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).

    0 讨论(0)
提交回复
热议问题