2011-11-17 151 views
11

我想压缩一个子目录并将它发送到别处,我遇到的问题是当我使用zip命令时,它还包含了我不想要的所有不需要的目录层。Unix压缩子目录不包括父目录

例如

zip -r /new.zip /Unwanted1/Unwanted2/wanted1/wanted2/file.txt 

###unzipped produces the following 
/Unwanted1/Unwanted2/wanted1/wanted2/file.txt 

###I want 
/wanted1/wanted2/file.txt 

更新:我想压缩的目录有很多嵌套的目录,因此-r。此外,处理绝对路径将会很好,旧的解决方案用于关于这个地方的CD,但我不太喜欢它。也许这是最好的(唯一的)方式。

+0

'-r'表示递归。如果你真的需要使用它,那么你应该阅读压缩选项的排除。如果你只想压缩一个文件,可以cd到合适的父目录(根据你的例子)./Unwanted1/Unwanted2然后'zip new.zip wanted/file.txt'。也就是说,我不认为有一个zip选项意味着'放弃输入文件名中的前n层子目录信息'。祝你好运。 – shellter

+0

你已经编辑过你的例子,这会改变游戏的数量。人们通常不需要这样的绝对路径。 'zip'内可能有更多的路径修剪/控制选项,但我对此表示怀疑。阅读手册页。或者切换到'tar'并阅读(同样长的)手册页。而且,如果您要添加单个文件,无论多深,您仍然不需要-r。 – IcarusNM

回答

16

您必须将目录更改为您想要开始的任何位置,或者可以选择'zip'来为您执行此操作。如果你懒得阅读手册页中的gazillion选项,就像我一样,即使在脚本中也只是'cd'。或者你可以附上括号中的整个事情,而不会影响你的shell或脚本的工作目录:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip ./wanted/file.txt) 

或者由于您使用-r你可能需要的不仅仅是file.txt的多,所以:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip wanted) 

或者使用PUSHD/POPD跳/出:

pushd Unwanted1/Unwanted2 
zip -r ~/new.zip wanted 
popd 

这个工作在SH/bash中/ CSH/tcsh的。

3

最简单的,惯用的方式:

(cd ./Unwanted1/Unwanted2 && zip -r ../../new.zip ./wanted/file.txt) 

现在拉链,焦油,RAR,的cpio和朋友都选项管理相同,但他们可能从版本从归档实用程序的不同而不同版本肯定归档工具。我建议你学会与外壳的工作做的工作,你可以使用你的愿望

任何存档格式,另一种方法:

(cd ./Unwanted1/Unwanted2 && find . -name "*.txt" -print) | zip new.zip [email protected] 
+0

尽管我更喜欢'zip'中的标志/选项来省略父文件夹结构,但似乎并没有更好的方式。 '-j'或'-D'这两个标记都没有在复杂的子文件夹结构上做我们想要的。 – paperclip

3

那么一个简单的办法解决可能做

cd ./Unwanted1/Unwanted2 
zip -r ../../new.zip ./wanted/file.txt 

但我不知道你的情况是什么。也许你需要从基本目录运行?当你想递归遍历目录时也使用“-r”选项 - 你提供的例子是使用一个文件。

+0

感谢它实际上是多个目录和文件,例如v。简单 –

+0

是的,就像伊卡洛斯和塞伊说的那样,如果你把括号里的命令括起来,它在完成执行后不会搞乱你当前的工作目录。 – loosebazooka