使用zip压缩时避免不需要的目录
概述
在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进入我们的方式
pushd对于从/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存档中出现不需要的多余文件夹。
如果我们只使用一种干净的方法来组织我们的文件,将会容易得多。