避免 Zip 文件中不需要的路径

jer*_*ood 58 zip bash path shell-script macos

我正在制作一个shell脚本来打包一些文件。我正在压缩这样的目录:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/
Run Code Online (Sandbox Code Playgroud)

问题是生成的 out.zip 存档中包含整个文件路径。也就是说,解压缩后,它将包含整个“/Users/me/development/anotherthing/”路径。将目录放入存档时是否可以避免这些深层路径?

当我从目标目录中运行 zip 时,我没有这个问题。

zip -r out.zip ./folder/
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我没有得到所有的垃圾。但是,有问题的脚本将从任何地方调用。

FWIW,我在 Mac OS X 10.6 上使用 bash。

qua*_*ote 104

发出命令之前,您的脚本应该使用cdpushdpopd移动到将成为存档根目录的目录。你如何做到这一点将取决于脚本如何知道要压缩什么。但是,如果您希望/Users/me/development/something/folder使用./folder 的内部路径压缩,则需要执行以下操作:zip

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd
Run Code Online (Sandbox Code Playgroud)

这将导致您的out.zip包含您想要的相对路径。

如果您在编写脚本方面需要帮助,则需要向我们展示您的脚本。

  • 没问题。我一直在命令行的单行中执行此操作,例如:`$ pushd /some/path ; 做点什么 ; popd` ... 甚至使用子shell:`$ ( cd /some/path ; do-something )` (9认同)
  • 如果不指定 zip 文件的绝对路径,就没有办法做到这一点吗? (3认同)
  • 你为什么要玩路径游戏?为什么不使用`zip -j`? (3认同)
  • 如果您希望文件的路径嵌套在指定文件夹内,则 -j 不能与 -r 一起使用 (2认同)

jww*_*jww 10

问题是生成的 out.zip 存档中包含整个文件路径。
...
将目录放入存档时是否可以避免这些深路径?

是的。使用-j带有的选项zip-j是“垃圾路径”。根据zip 上手册页

仅存储已保存文件的名称(垃圾路径),而不存储目录名称。默认情况下,zip 将存储完整路径(相对于当前目录)。

使用-j意味着以下命令:

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt
Run Code Online (Sandbox Code Playgroud)

将创建一个如下所示的存档:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt
Run Code Online (Sandbox Code Playgroud)

  • 这不是也垃圾所有路径,即使是“文件夹”目录中的路径?我认为 OP 只想摆脱命令行上的路径。 (7认同)

小智 7

pushdpopd$OLDPWD。假设$PWD/Users/me/development这样做:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd
Run Code Online (Sandbox Code Playgroud)

现在$PWD回到/Users/me/development