压缩档案而不包含父目录


30

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

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

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

如何避免这种情况?

Answers:


23

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

例:

/test/test.txt
/test/test2.txt

将test.txt和test2.txt存储在zip中,但不存储在/ test /

您可以cd进入/ 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;

是的,但是我有很多文件,我在上面做同样的事情,所以这样做会很乏味,所以就像bash脚本一样,或者可以自动执行具有所有文件夹的目录上的相同过程的文件
Dami

1
好的,我运行了脚本并在存档中创建了父目录,我只希望文件夹中的内容位于存档中
Dami

1
我的错,错过了一点。添加了一个-j参数,我只是查找了它,显然跳过了不需要的部分。试试这个:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
zzbomb 2014年

18
zip -r test.zip test / *从外部将测试作为目录添加到zip文件中
smihael

4
如@smihael所述,zip -r test.zip test/*不起作用。有没有从目录外部实现此目的的正确方法?
andrhamm '17

22

使用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).

这似乎是正确的答案。
mutant_city

3
嵌套路径/文件夹呢?
GuyPaddock

3
这将忽略存档中的所有文件夹,并且如果您在其他文件夹中有重复的文件名,则会被炸掉。它有它的位置,但是仅当您不关心文件夹而只需要文件时。不是OP所要的,而是丰富的知识
Govind Rai

17

这个命令怎么样?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

5
虽然这是一个正确的答案,但简介听起来并不像您说服了自己。这也将有助于解释该命令的作用。
Nephente '16

1
这也是我的解决方案,但是我不喜欢它,因为它涉及到cd。希望有一种方法可以更精确地指定存储的路径。
nilskp

3

希望这可以帮助。

(cd directory && zip -r ../out.zip .)

它将主外壳程序保留在同一目录中,并且仅更改命令后死亡的子外壳程序的目录。


我想将此添加为@Alfred UC的答案的注释,但我对此没有足够的声誉。
肯尼思

如果它确实解决了问题,那么它可能是一个解决方案。
Yufenyuy Veyeh Dider

这是更好的答案。这对bash和sh都起作用吗?
Arlen Beiler
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.