我正在编写一个 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
您的脚本应该使用cd
或pushd
和popd
移动到将成为档案根目录的目录前发出zip
命令。具体如何执行此操作取决于脚本如何知道要压缩的内容。但是,如果你想/用户/我/开发/某物/文件夹使用内部路径压缩。/文件夹,你需要这样做:
pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd
这将导致你的输出文件包含您想要的相对路径。
如果您需要脚本方面的帮助,您需要向我们展示您的脚本。
答案2
问题是生成的 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
答案3
有pushd
和popd
和$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
采用完全相同的文件结构。