压缩目录中的所有文件?

tkb*_*kbx 617 command-line zip wildcards

有没有办法使用zip命令压缩给定目录中的所有文件?我听说过使用*.*,但我希望它也适用于无扩展名的文件。

der*_*ert 895

你可以使用*; 没有必要*.*。文件扩展名在 Unix 上并不特殊。*匹配零个或多个字符——包括一个点。所以它匹配foo.png,因为那是零个或多个字符(准确地说是七个)。

请注意,*默认情况下不匹配以点开头的文件(也不匹配*.*)。这通常是您想要的。如果没有,则在 bash 中,如果您shopt -s dotglob愿意(但仍会排除...)。其他 shell 有不同的方式(或根本没有)包含点文件。

或者,zip也有一个-r(递归)选项可以一次完成整个目录树(而不必担心点文件问题):

zip -r myfiles.zip mydir
Run Code Online (Sandbox Code Playgroud)

mydir包含您的文件的目录在哪里。请注意,生成的 zip 将包含目录结构和文件。正如 peterph 在他的评论中指出的那样,这通常被视为一件好事:解压缩 zip 会将所有解压缩的文件整齐地存储在一个子目录中。

您还可以使用-j/--junk-paths选项告诉 zip 不存储路径。

zip命令附带的文档告诉您它的所有(许多)选项;键入man zip以查看该文档。这不是 zip 独有的;您可以通过这种方式获取大多数命令的文档。

  • 您可能想补充一点,将存档中的所有内容包含在顶级目录中被认为是一种很好的做法 - 这样就不会在提取时污染他/她的当前目录。 (11认同)
  • 请记住,`*` shell-globbing 不包括点文件(即以`.` 开头的文件名)。这是按名称压缩整个目录的另一个优点。 (3认同)

Rad*_*ugh 20

就我而言,我想将每个文件压缩到自己的存档中,因此我执行了以下操作(在 中zsh):

$ for file in *; do zip ${file%.*}.zip $file; done
Run Code Online (Sandbox Code Playgroud)

  • 这里没有`mkv`吗?这里也没有什么是特别针对 `zsh` 的。您需要正确引用包含文件名的任何变量,因此`zip "${file%.*}.zip" "$file"` 和两个变量周围的双引号。 (2认同)
  • 要将每个文件压缩到自己的存档中,请执行“gzip *” (2认同)

Ger*_*erg 8

另一种方法是使用 find 和 xargs :(这可能在 zip 中包含一个“.”目录,但它仍应正确提取。在我的测试中,zip 在压缩前去除了点) find . -type f -exec zip zipfile.zip {} +

(如果您的版本不支持exec的结尾,+则可以替换为。虽然它会更慢......)\;find+

这将默认包括所有子目录。在 GNU 上 find-maxdepth可以防止这种情况。