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


49

我正在制作一个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/

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

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

Answers:


85

发出命令之前,脚本应使用cdpushdpopd移至将成为归档文件根目录的目录。具体如何执行将取决于脚本如何知道要压缩的内容。但是,如果您希望/ Users / me / development / something / folder的内部路径只是./folder,则需要执行以下操作:zip

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

这将导致out.zip包含所需的相对路径。

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


8
没问题。我一直在命令行上使用单行代码执行此操作,例如:$ pushd /some/path ; do-something ; popd...甚至使用子shell:$ ( cd /some/path ; do-something )
quack quixote 2010年

1
@〜quack:+1,尤其是对于注释中的sub-shell技术。
乔纳森·勒夫勒

1
尽管使用&&代替代替;是一个好主意,这样,如果cd失败(打字错误或其他问题),则其他命令不会运行:(cd /some/path && do-something)
克里斯·约翰森

3
没有指定zip文件的绝对路径,是否有办法做到这一点?
orange80

2
你为什么在玩游戏的道路?为什么不使用zip -j
jww

5

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

是。将-j选项与一起使用zip-j是“垃圾之路”。根据zip上手册页

仅存储已保存文件的名称(替换路径),而不存储目录名称。默认情况下,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

5
难道这也不会浪费所有路径,甚至是“文件夹”目录中的路径吗?我认为OP仅希望摆脱命令行上的路径。
彼得·贾里克

1
这可能不是这个问题的答案,但这正是我所需要的。
亚伦·麦克米林

1
该答案错误地假定用户需要平拉链。这是一个错误的假设,如果不同子文件夹中的两个文件具有相同的名称,则可能导致脚本失败。
安德鲁·施瓦兹

1

pushdand popd$OLDPWD。假设$PWD/Users/me/development

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.