压缩档案而不包括父目录

Dam*_*ami 51 command-line compression zip

我想像这样在目录树中压缩许多文件夹

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar
Run Code Online (Sandbox Code Playgroud)

当我尝试压缩它时,它会结束使用 v 文件夹而不是它的内容(子目录和文件)创建一个 zip 存档

我怎样才能避免这种情况?

小智 44

在 zip 命令中使用-jor--junk-paths选项。

zip 手册页

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).
Run Code Online (Sandbox Code Playgroud)

  • 这将省略存档中的所有文件夹,如果您在不同文件夹中有重复的文件名,这会爆炸。这有它的位置,但前提是您不关心文件夹而只想要文件。不是 OP 所要求的,但仍然是很好的知识 (13认同)
  • 但是嵌套路径/文件夹呢? (11认同)

jsp*_*zel 36

因此,如果我理解正确,您正在尝试将文件和文件夹存档在特定文件夹中,但不包括根文件夹。

例子:

/test/test.txt
/test/test2.txt
Run Code Online (Sandbox Code Playgroud)

其中 test.txt 和 test2.txt 将存储在 zip 中,而不是 /test/

你可以 cd 进入 /test/ 目录然后运行类似的东西,

zip -r filename.zip ./*
Run Code Online (Sandbox Code Playgroud)

这将在名为 filename.zip 的同一文件夹中创建一个存档。或者,如果从您可以运行的文件夹外部运行它,

zip -r test.zip test/*
Run Code Online (Sandbox Code Playgroud)

/* 是仅包含文件夹内容的部分,而不是整个文件夹。

编辑:OP 想要多个 zip,解决方案最终有点麻烦,我很好奇是否有更好的方法来做到这一点。

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;
Run Code Online (Sandbox Code Playgroud)

  • zip -r test.zip test/* 从外部将 test 作为目录添加到 zip 文件中 (41认同)
  • 正如@smihael 所说,`zip -r test.zip test/*` 不起作用。有没有正确的方法可以从目录外部实现这一目标? (8认同)
  • 好的,我运行了脚本,它在存档中创建了一个父目录,我只希望文件夹的内容在存档中 (3认同)

小智 27

这个命令怎么样?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个正确的答案,但介绍听起来并不像您确信自己。它也有助于解释一下命令的作用。 (6认同)
  • 这也是我的解决方案,但我不喜欢它,因为它涉及到 `cd`。希望有一种方法可以更精确地指定存储路径。 (2认同)

Ken*_*eth 24

希望这可以帮助。

(cd directory && zip -r ../out.zip .)
Run Code Online (Sandbox Code Playgroud)

它将主 shell 保持在同一目录中,并且只更改在命令后死亡的子 shell 的目录。

  • 我想将此添加为对 [@Alfred UC](https://askubuntu.com/users/484653/alfred-uc) 答案的评论,但我对此没有足够的声誉。 (2认同)
  • 如果它真的解决了问题,那么它可能是一个解决方案。 (2认同)
  • 手下最优雅的一个。 (2认同)

小智 6

cd `dirname path/to/archive` && zip -rq $OLDPWD/arhive.zip . && cd -
Run Code Online (Sandbox Code Playgroud)

这不仅适用于展平树(例如-j),而且您可以指定任何目录(不仅是子目录)