使用 zip 时避免不必要的目录

linuxopen sourceoperating system更新于 2026/1/27 19:22:17

概述

在 Linux 系统上,有很多不同的方法可以压缩和收集文件。我们可以使用以下几种方法:使用命令行工具、GUI 应用程序。

但是,如果我们与 Windows 或 Mac 用户共享文件,ZIP 文件仍然是最方便的选择。我们希望保持它的便捷性。

我们将了解如何组织文件,避免它们被不必要的文件夹弄得杂乱无章。我们将学习一些基本的文件管理技巧。如果您手动执行这些操作,这些操作可能看起来很明显,但使用脚本时可能会变得棘手。

我们将使用 bash shell 内置的 push/pop 命令来解决这个问题。

使用 -r 压缩所有内容

当我们的朋友或同事下载我们发送给他们的 ZIP 文件时,我们通常希望保留基本的文件夹层次结构。我们可以使用 zip 命令的 -r 选项来实现。

假设我们要包含 twine JS/src/vue 文件夹中的所有内容及其下的所有内容。

~$ ls -R /home/allan/Source/twinejs/src/vue/
/home/a/Source/twinejs/src/vue/:
codemirror-theme.less directives index.less mixins transitions.less

/home/allan/Source/twinejs/src/vue/directives:
mouse-scrolling.js mouse-scrolling.less

/home/allan/Source/twinejs/src/vue/mixins:
dom-events.spec.js mount-to.js

文件数量非常多,位于三个独立的目录中。如果我们使用"zip"来压缩树中的每个目录,我们会得到这个结果 -

~$ zip -r ~/twine-vue.zip /home/allan/Source/twinejs/src/vue
 updating: home/allan/Source/twinejs/src/vue/ (stored 0%)
   adding: home/allan/Source/twinejs/src/vue/codemirror-theme.less (deflated 73%)
   adding: home/allan/Source/twinejs/src/vue/directives/ (stored 0%)
   adding: home/allan/Source/twinejs/src/vue/directives/mouse-scrolling.less (deflated 37%)
   adding: home/allan/Source/twinejs/src/vue/directives/mouse-scrolling.js (deflated 68%)
   adding: home/allan/Source/twinejs/src/vue/index.less (stored 0%)
   adding: home/allan/Source/twinejs/src/vue/mixins/ (stored 0%)
   adding: home/allan/Source/twinejs/src/vue/mixins/mount-to.js (deflated 31%)
   adding: home/allan/Source/twinejs/src/vue/mixins/dom-events.spec.js (deflated 69%)
   adding: home/allan/Source/twinejs/src/vue/transitions.less (deflated 63%)

我们不想告诉他完整的路径;那样他就得遍历好几个文件夹才能找到文件。

如果必须手动归档文件,我们可以进入想要捕获的目录 (vue),但这在 shell 中会很麻烦。如果能有个选项或方法避免这种情况就好了!

使用 -j 选项清除所有目录

-J 选项会"清除"所有添加到 ZIP 压缩包的新文件的目录。它类似于 basename 命令:它只保留新文件的文件名,并从其路径中删除所有目录名。

我们来试一试,看看是否能更接近我们真正需要的效果。

~$ zip -rj ~/twine-vue.zip /home/a/Source/twinejs/src/vue
   adding: codemirror-theme.less (deflated 73%)
   adding: mouse-scrolling.less (deflated 37%)
   adding: mouse-scrolling.js (deflated 68%)
   adding: index.less (stored 0%)
   adding: mount-to.js (deflated 31%)
   adding: dom-events.spec.js (deflated 69%)
   adding: transitions.less (deflated 63%)

这不太正确。如果我们解压这个文件,它的内容会散落在我们朋友的下载目录中。我们可以使用命令行工具"cd"(更改目录)来代替。

pushd 和 popd 作为更好的 cd 方式

为了使我们的脚本更稳定,我们可以在 shell 中使用 pushdir() 函数将我们发送到我们希望进入的目录,并跟踪我们从哪里开始。

pushd Our Way In

push d 对于从 /usr/local/bin 运行脚本非常有用。我们稍后会看到一个例子。

/usr/local/bin$ pushd /home/a/Source/twinejs/src/
~/Source/twinejs/src /usr/local

pushd 将我们移动到指定的目录,然后返回当前工作目录。我们使用它来导航回原始位置。

我们现在位于 vue 的正上方文件夹中,可以使用 -r 选项将其压缩。

~/Source/twinejs/src$ zip -r ~/twine-vue.zip vue/
   adding: vue/ (stored 0%)
   adding: vue/codemirror-theme.less (deflated 73%)
   adding: vue/directives/ (stored 0%)
   adding: vue/directives/mouse-scrolling.less (deflated 37%)
   adding: vue/directives/mouse-scrolling.js (deflated 68%)
   adding: vue/index.less (stored 0%)
   adding: vue/mixins/ (stored 0%)
   adding: vue/mixins/mount-to.js (deflated 31%)
   adding: vue/mixins/dom-events.spec.js (deflated 69%)
   adding: vue/transitions.less (deflated 63%)

当 ZIP 文件接收者从我们这里提取礼物时,所有内容都会被整齐地组织到一个文件夹中。

popd 再次退出

当我们的脚本需要返回到原始位置时,我们会使用 popdir。我们可以现在或稍后执行此操作——无论我们当前工作目录位于何处,最终都会回到起始目录。

~/Source/twinejs/src$ popd
/usr/local/bin
/usr/local/bin$

我们回到了 /usr/local/bin,这是一个保存脚本的整洁位置。现在让我们继续运行它们。

结论

我们使用一个有用的 shell 命令来避免 ZIP 压缩包中出现不必要的额外文件夹。

如果我们使用一种简洁的方法来组织文件,就会容易得多。


相关文章


有用资源