压缩档案而不包含父目录


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.