如何将多个文件压缩到单独的档案中?

如何将多个文件压缩到单独的档案中?

我承认这个问题以前在这里被问过:

喜欢压缩成单独的文件提问者没有说明他使用的操作系统,因此没有收到任何答复。

我需要将一个巨大的目录分成多个彼此不相互依赖的 .zip 文件。因此,不要这样做:

文件1.zip
文件2.z01
文件3.z02

我想要的是以下一组文件:

文件1.zip
文件2.zip
文件3.zip

基本上这就是我的问题。我使用的是 OS X,因此 shell 脚本或 AppleScript 是最简单的方法。

此外,这里有一个人问了同样的问题 - 只是他想创建一个 .tar 档案:如何为一组文件创建单独的档案

答案是正确的,但是会产生 tar 文件:

for file in `ls *`; do tar -czvf $file.tar.gz $file ; done

附言:最后一部分仅针对那些适合 Keyboard Maestro 的人:

我也尝试在 Keyboard Maestro 中执行此操作,我有一个“for each”操作设置,它确定文件路径,然后触发 shell 脚本。输出是正确的,如果我将其粘贴到终端中(例如zip /Users/me/Desktop/test /Users/me/Desktop/test.txt),宏就会起作用。

但是,当我将这两个变量传递给 Keyboard Maestro 中的 shell 脚本时,它不起作用:
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

答案1

解决方案非常简单。如果你想对每个文件执行此操作,请使用find。它将列出所有文件和目录,并包括子目录。

find . -type f -execdir zip '{}.zip' '{}' \;

解释:

  • 第一个参数是你想要开始的目录,.
  • 然后我们将限制它仅查找文件(-type f
  • -execdir选项允许我们对找到的每个文件运行一个命令,并从文件的目录中执行它
  • zip file.txt.zip file.txt例如,此命令被评估为,因为所有出现的{}都被替换为实际文件名。此命令需要以\;

当然,find还有更多选择。如果您只想停留在当前目录中,而不是进入子目录:

find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;

如果您想将其限制为某些文件类型,请使用该-name选项(或-iname进行不区分大小写的匹配):

find . -type f -name "*.txt" …

在我看来,其他任何内容(包括循环输出forls *都是非常丑陋的语法,并且可能会中断,例如文件名称中带有空格或由于参数太多。

相关内容