使用绝对路径压缩 linux 目录

Zip linux directory using absolute path

在 linux 实例中,我在 /var/lib/work_directories/ 位置下有一个名为 test 的目录需要在 /home/test_user/ 位置压缩为 test.zip.

我可以使用以下命令从位置 /home/test_user/ 创建一个 zip 文件:

zip test.zip /var/lib/work_directories/test

但是当我使用下面的命令解压缩它时,我可以看到它已经压缩 var 我需要导航到最后:

unzip test.zip

所以,在解压缩 test.zip 之后,它看起来像 /home/test_user/var/lib/work_directories/test/ 但理想情况下我希望这样的东西 /home/test_user/test/<:内容:>

任何建议都会很有帮助!提前致谢!

您的方法将取决于 /var/lib/work_directories/test 的结构。如果目录是扁平的,没有任何子目录,您可以简单地使用 -j 标志,这将删除所有父目录(包括直接父目录 test/):

$> tree test
test
├── a
├── b
└── c

$> zip -rj test.zip test
updating: a (stored 0%)
updating: c (stored 0%)
updating: b (stored 0%)

如您所见,从存储的 value.This 中删除了每个文件的基本名称以外的所有内容,在大多数情况下可能无法很好地为您服务。最简单的解决方案是 cd 到目标目录并压缩。像 cd /var/lib/work_directories && zip -r test.zip test

作为脚本,它会像这样:

# absolute path to target directory
absolute=/var/lib/work_directories/test

# parent directory
dir="$(dirname $target)"

# directoy basename
base="$(basename absolute)"

cd "$dir"
zip -r "$target.zip" "$target"

这将导致仅包含最后一个目录名称:

updating: test/ (stored 0%)
  adding: test/a (stored 0%)
  adding: test/c (stored 0%)
  adding: test/b (stored 0%)

如果您必须 return 到压缩后目录树中与之前相同的位置,您可以利用 pushpopd 获得类似的效果:

# absolute path to target directory
absolute=/var/lib/work_directories/test

# parent directory
dir="$(dirname $target)"

# directoy basename
base="$(basename absolute)"

pushd "$dir"
zip -r "$target.zip" "$target"
popd