在bash脚本中创建zip存档时仅包含子目录

时间:2011-11-16 20:21:57

标签: bash shell zip command-line-interface

我有一个如下所示的目录结构:

basedir/dir1/dir2/dir3/dir4/myzip/subdirs

我想创建myzip目录及其所有子目录的存档,但不在zip存档中包含dir1到dir4,并将生成的存档myzip.zip保存在basedir中。

这不起作用,因为dir1到4包含在档案

cd basedir
zip -r myzip.zip dir1/dir2/dir3/dir4/myzip

我知道我可以这样做

cd basedir/dir1/dir2/dir3/dir4
zip -r ../../../../myzip.zip myzip
cd ../../../..
# Need to go back to basedir for next commands

这也有效

cd basedir
cp -r dir1/dir2/dir3/dir4/myzip myzip
zip -r myzip.zip myzip
rm -rf myzip
# Kind of annoying to have to copy then remove

有更优雅的方式吗?我希望我可以为我输入的第一个命令添加一些参数,使其按照我想要的方式在一行中运行。

我不想做大多数人想做的事吗? IMO他们应该只在zip命令中包含子目录。

我不明白当前zip实现的重点,因为所有这些都做同样的事情:

zip -r myzip.zip dir1/dir2/dir3/dir4/myzip
zip -r myzip.zip dir1/dir2/dir3/dir4
zip -r myzip.zip dir1/dir2/dir3/
zip -r myzip.zip dir1/dir2/
zip -r myzip.zip dir1/

编写zip命令会不会更聪明,所以它默认只包含子目录?

然后,如果你想要dir1到dir4,你可以这样做:

myVersionOfZip -r myzip.zip dir1

如果您只想使用myzip的子目录,那么:

myVersionOfZip -r myzip.zip dir1/dir2/dir3/dir4/myzip

2 个答案:

答案 0 :(得分:3)

如果你使用pushd,你可以避免使用cd ../../../ ..

pushd basedir/dir1/dir2/dir3/dir4
zip -r myzip.zip myzip
popd

档案工具旨在保存路径信息,所以我怀疑你正在尝试的方法。

这将使您的脚本更优雅。

答案 1 :(得分:0)

包含来自basedir / dir1..dir4的任何文件 - 它包含的全部是目录本身,因为-r保留整个路径,以便当有人提取您的存档时,他会被提供给相同的结构。这也是该行为的重点,因此“zip -r foo.zip foo /”不仅保留所有文件,还保留目录结构。

相关问题