压缩目录中的所有文件?
有没有一种方法可以用zip
命令压缩指定目录下的所有文件?我听说过使用*.*
,但我希望它对无扩展名的文件也有效。
487
4
有没有一种方法可以用zip
命令压缩指定目录下的所有文件?我听说过使用*.*
,但我希望它对无扩展名的文件也有效。
你可以直接使用
*
;没有必要使用*.*
。文件的扩展名在Unix中并不特别。*
匹配零个或多个字符--包括一个点。所以它匹配foo.png
,因为它是零或更多的字符(确切地说,是七个)。注意
*
默认情况下不匹配以点开头的文件(*.*
也不匹配)。这通常是你想要的。如果不是这样,在bash中,如果你shopt -s dotglob
会匹配(但仍会排除.
和.
)。其他shells有不同的方法(或者根本就没有)包括dotfiles。另外,
zip
也有一个-r
(递归)选项,可以一次完成整个目录树(而不必担心点文件的问题)。其中
mydir
是包含你的文件的目录。注意,生成的压缩包将包含目录结构和文件。正如peterph在他的评论中指出的,这通常被看作是一件好事:解压后,所有被解压的文件将整齐地存放在一个子目录下。你也可以用
-j
/-junk-paths
选项告诉zip不要存储路径。zip
命令带有文档,告诉你它所有的(许多)选项;输入man zip
可以看到这些文档。这并不是zip独有的,你可以通过这种方式获得大多数命令的文档。在我的例子中,我想把每个文件压缩成自己的档案,所以我做了以下工作(在
zsh
中)。另一种方法是使用find和xargs:(这可能会在zip中包括一个"."目录,但它仍然应该正确解压。在我的测试中,zip在压缩前剥离了圆点)
查找.-type f -exec zip zipfile.zip {}。+
(如果你的
find
版本不支持exec的+
结尾,可以用/;
代替+
。不过速度会比较慢...)这将默认包括所有子目录。在GNU find中,`-maxdepth'可以防止这种情况。
另一种(缓慢的)方法(一次只添加一个文件到zip中)。
这有
*
的dotfile问题(增加了变通办法),并且会对每个文件启动一次zip,将其添加到档案中。 在bash
中,它将处理大量的文件。它将比大多数其他方法慢,但相对简单。