所有文章

如何在 Mac 上把每个文件或文件夹单独压缩

· 阅读约 8 分钟

十个客户文件夹,每个客户只该收到自己的那一个。一周的录音,要一段一段上传。旧项目要归档,每个打成一个 ZIP。可是在访达中把它们全选,选取压缩,得到的只是一个装着所有内容的归档.zip。

简短的答案:

  • 访达没有办法为每个项目各做一个归档。要么逐个压缩,要么使用下面的“终端”循环,它还可以做成快速操作。
  • 在 Folia Files 中,选中项目,右键点按,移到压缩,在每个项目单独压缩下选择 ZIP、7Z、TAR.GZ 或 TAR.XZ。每个项目都会得到自己的归档,就放在它旁边。

访达的“压缩”做了什么

右键点按单个项目,选取压缩“Atlas”:你会得到一个以它命名的 ZIP,文件夹是 Atlas.zip,文件是 report.pdf.zip。选中多个项目时,这个命令会变成压缩3个项目(数字随所选数量而变),所有项目都会进入同一个文件夹里名为归档.zip的单个归档。

没有任何设置能让每个项目各得一个归档。要么一个一个压缩,要么交给一个小脚本。

在“终端”中逐个压缩

macOS 自带 ditto,这个复制工具也能像访达那样制作 ZIP 归档。一个简短的循环会为文件夹里的每个项目各运行一次:

  1. 打开“终端”(在“应用程序” › “实用工具”中)。
  2. 输入 cd 和一个空格,把装着这些项目的文件夹拖到“终端”窗口上,然后按 ↩。
  3. 粘贴下面这几行,再按 ↩:
for item in ./*; do
  [[ "$item" == *.zip || -e "$item.zip" ]] && continue
  if [[ -d "$item" ]]; then
    ditto -c -k --sequesterRsrc --keepParent "$item" "$item.zip"
  else
    ditto -c -k --sequesterRsrc "$item" "$item.zip"
  fi
done

现在文件夹里的每个项目旁边都有了自己的 ZIP:Atlas 文件夹旁边是 Atlas.zip,report.pdf 旁边是 report.pdf.zip。文件夹里的每个文件和文件夹都会得到一个归档,所以请在只装着要归档的内容的文件夹里运行。各部分的作用如下:

  • ./* 依次处理文件夹里的项目,但不包括隐藏项目(名称以句点开头的)。前面的 ./ 可以防止以连字符开头的名称被当成选项。
  • 第二行会跳过 ZIP 文件本身,以及已经有归档的项目,所以循环运行两次也不会重做或覆盖任何东西。
  • 文件夹用 --keepParent 归档,解压后得到的就是这个文件夹本身。文件则单独归档:如果对文件使用 --keepParent,ditto 会把它放进一个以它所在文件夹命名的文件夹里。
  • --sequesterRsrc 会把 Mac 特有的数据存放在归档内的 __MACOSX 文件夹中,和访达制作的 ZIP 一样。

名称里有空格或中文也没问题:每个 $item 都加了引号。

其他格式可以用 macOS 的 tar 命令来做。把 if … fi 这一段换成下面任意一行,并把第二行里的 .zip 换成相同的扩展名:

  • TAR.GZ:tar -czf "$item.tar.gz" "$item"
  • TAR.XZ:tar -cJf "$item.tar.xz" "$item"
  • 7Z:tar --format 7zip -cf "$item.7z" "$item"

如果你用 Folia Files,可以右键点按文件夹的空白处,选择在终端中打开:终端会直接在这个文件夹中打开,不用再 cd。官网版还有在面板下方打开的 Folia Files 终端,如下图所示。

在 Folia Files 面板下方的终端中运行同一个循环:Atlas、Design 和网站文件夹各自得到了自己的 ZIP

把循环做成快速操作

想在访达中右键一点就能用:

  1. 打开“自动操作”,选取文件 › 新建,选择快速操作,然后点按选取。
  2. 在顶部那一行,把工作流程收到当前设为文件或文件夹,把第二个菜单设为 Finder.app。
  3. 把运行Shell脚本操作从资源库拖进工作流程。确认 Shell 显示的是 /bin/zsh,把传递输入设为作为自变量,再把其中的文字换成上面的循环,只是第一行改成 for item in "$@"; do(也就是你右键点按的项目)。
  4. 按 ⌘S 存储,取一个像“逐个压缩”这样的名称。

现在在访达中右键点按文件时,它会出现在快速操作下。设为 Finder.app 的快速操作不会出现在其他 App 的菜单中,原因见为什么你的自动操作快速操作只出现在访达中(官网版 Folia Files 照样会列出它)。

在 Folia Files 中:压缩 › 每个项目单独压缩

Folia Files 在任何显示方式下都能通过右键菜单完成:

  1. 选中项目:按住 ⌘ 点按或按住 ⇧ 点按,或按 ⌘A 全选。
  2. 右键点按其中一个,移到压缩。
  3. 上面的四种格式会像访达一样,把整个选择做成一个归档:归档.zip。每个项目单独压缩下的同样四种格式,则为每个项目各做一个归档。只要选中两个或更多项目,下面这一部分就会出现。

对三个选中文件夹打开的“压缩”子菜单:ZIP、7Z、TAR.GZ 和 TAR.XZ,下面“每个项目单独压缩”中是同样的格式

你会得到:

  • 每个项目旁边一个归档,以项目命名:Atlas.zip、Design.zip……文件的名称里会保留扩展名,例如 Notes.md.zip,和访达一样。
  • 不会替换任何东西。如果已经有 Atlas.zip,新的会叫 Atlas 2.zip。
  • 可以来自多个文件夹。在“树状”显示方式中,可以选中不同子文件夹里的项目:每个归档都会放在各自项目的旁边。
  • 新归档完成后会被选中,可以直接拖进邮件,或拖到另一个面板中打开的云端或服务器文件夹。

压缩和右键菜单中其他的归档与文件工具放在一起,详见文件工具页面。

在“操作”中查看进度、暂停或取消

Folia Files 会一个接一个地制作归档,而不是同时进行:几个压缩程序一起运行,只会争抢磁盘。每个归档在操作中占一行。“操作”是工具栏上的按钮,也会显示拷贝和移动的进度(也可以用窗口 › 正在进行的操作,⌃⌘O):

  • 正在压缩为 .zip(或 .7z、.tar.gz……),附带根据开始前测得的大小计算的进度条、正在加入的文件名、已完成量与总量、速度和剩余时间。排队等候的归档显示正在准备…。
  • 暂停按钮会让压缩程序停在原处,点按继续就从那里接着做。后面的归档会等待。
  • ✕ 按钮(取消)可以停止一个归档。每个归档都以隐藏的名称写在项目旁边,完成后才换上真正的名称:所以取消的归档什么也不会留下,写到一半的文件也不会看起来像已完成。已经做好的归档会保留,其他的继续进行。

ZIP、7Z、TAR.GZ 还是 TAR.XZ?

  • ZIP 在 Mac 和 Windows 电脑上都能双击打开,什么都不用安装。发给客户、同事,或不清楚对方用什么电脑时,就选它。
  • 7Z 通常比 ZIP 小,文档、文本和代码尤其明显。但并不是每台电脑不装额外 App 就能打开,所以请留给装了这类 App 的人,或用于你自己的归档。
  • TAR.GZ 是 Linux 服务器和开发者的习惯格式,会原样保留 Unix 权限和符号链接。
  • TAR.XZ 一般比 TAR.GZ 更小,但制作起来更慢。

照片、视频和音乐本身已经压缩过,任何格式都不会让它们小很多。把它们归档是为了放在一起或方便发送,而不是为了节省空间。

再次打开

在 Folia Files 中,双击 ZIP、7Z 或 TAR 归档,它就会在面板中像文件夹一样以只读方式打开;提取到此处会解压到归档旁边,解压到则解压到另一个文件夹。详见如何在 Mac 上不解压就打开 ZIP 文件。

总结

  • 访达:无论选了什么,整个选择都只会得到一个归档.zip。
  • 终端:用上面的 ditto 循环;TAR.GZ、TAR.XZ 和 7Z 用 tar。同一个循环也可以放进“自动操作”的快速操作中。
  • Folia Files:右键菜单的压缩 › 每个项目单独压缩,再选格式即可。每个项目旁边各一个归档,可在操作中查看进度,取消时什么也不会留下。