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

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

我正在编写一个 shell 脚本来打包一些文件。我正在压缩一个目录,如下所示:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

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

当我从目标目录内部运行 zip 时,没有遇到这个问题。

zip -r out.zip ./folder/

在这种情况下,我并没有得到所有的垃圾信息。但是,无论从何处都可以调用相关脚本。

仅供参考,我在 Mac OS X 10.6 上使用 bash。

答案1

您的脚本应该使用cdpushdpopd移动到将成为档案根目录的目录发出zip命令。具体如何执行此操作取决于脚本如何知道要压缩的内容。但是,如果你想/用户/我/开发/某物/文件夹使用内部路径压缩。/文件夹,你需要这样做:

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

这将导致你的输出文件包含您想要的相对路径。

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

答案2

问题是生成的 out.zip 档案中包含整个文件路径。...

目录放入档案时是否可以避免这些深路径?

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

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

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

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

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

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt

答案3

pushdpopd$OLDPWD。假设$PWD是 则/Users/me/development执行:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

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

答案4

我认为这是最紧凑的版本,也是效果最好的版本。

OLDPWD=$PWD; env -C /path/to/directory zip -r "$OLDPWD/directory.zip" .

这将在当前目录中生成一个名为“directory.zip”的 zip 文件。zip 文件内的内容将/path/to/directory采用完全相同的文件结构。

相关内容