2011-11-16 75 views
2

我有一个看起来像这样的目录结构:只有创造bash脚本的zip压缩文件时包括子目录

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

我愿与所有子目录创建的myzip目录的存档,但不包括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 

有没有更好的方法来做到这一点?我希望我可以添加一些参数给我输入的第一个命令,使其按照我想要的方式工作。

难道大多数人都不想做什么?海事组织他们应该只在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 

回答

3

可避免CD .. /../../ ..如果你使用pushd。

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

档案工具的目的是保存路径信息,所以我怀疑你有什么办法解决你的问题。

这将使您的脚本更优雅一点。

+0

或者在子外壳里做; '(cd basedir/dir1/dir2/dir3/dir4; zip -r ../../../../myzip.zip myzip)' – tripleee

0

它确实包括BASEDIR/dir1..dir4任何文件 - 所有它包含的目录自己是这样,当有人提取存档,他呈现相同的结构-r保持整个路径。这也是该行为的要点,因此“zip -r foo.zip foo /”不仅保留所有文件,而且还保留目录结构。