我想像这样压缩目录树中的许多文件夹
V-
something.txt
folder
folder
g.jpg
h.jar
当我尝试压缩它时,它最终创建一个包含 v 文件夹而不是其内容(子目录和文件)的 zip 存档
我该如何避免这种情况?
答案1
希望这可以帮助。
(cd directory && zip -r ../out.zip .)
它保持主 shell 在同一目录中,并且仅更改执行命令后终止的子 shell 的目录。
答案2
在 zip 命令中使用-j
或选项。--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).
答案3
因此,如果我理解正确的话,您正在尝试将文件和文件夹存档在特定文件夹中,但不包括根文件夹。
例子:
/test/test.txt
/test/test2.txt
其中 test.txt 和 test2.txt 将存储在 zip 中,但不存储在 /test/ 中
你可以进入 /test/ 目录然后运行如下命令,
zip -r filename.zip ./*
这将在名为 filename.zip 的同一文件夹中创建一个名为的存档。或者,如果从文件夹外部运行它,您可以运行,
zip -r test.zip test/*
/* 是仅包含文件夹内容的部分,而不是整个文件夹。
编辑:OP 想要多个 zip,但解决方案最终有点像黑客攻击,我很好奇是否有更好的方法来做到这一点。
for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;
答案4
cd `dirname path/to/archive` && zip -rq $OLDPWD/arhive.zip . && cd -
这不仅适用于 flatten tree(如-j
),而且你可以指定任何目录(不仅仅是子目录)