压缩目录中的所有文件?

有没有一种方法可以用zip命令压缩指定目录下的所有文件?我听说过使用*.*,但我希望它对无扩展名的文件也有效。

对该问题的评论 (4)
解决办法

你可以直接使用*;没有必要使用*.*。文件的扩展名在Unix中并不特别。*匹配零个或多个字符--包括一个点。所以它匹配foo.png,因为它是零或更多的字符(确切地说,是七个)。

注意*默认情况下不匹配以点开头的文件(*.*也不匹配)。这通常是你想要的。如果不是这样,在bash中,如果你shopt -s dotglob会匹配(但仍会排除..)。其他shells有不同的方法(或者根本就没有)包括dotfiles。

另外,zip也有一个-r(递归)选项,可以一次完成整个目录树(而不必担心点文件的问题)。

zip -r myfiles.zip mydir

其中mydir是包含你的文件的目录。注意,生成的压缩包将包含目录结构和文件。正如peterph在他的评论中指出的,这通常被看作是一件好事:解压后,所有被解压的文件将整齐地存放在一个子目录下。

你也可以用-j/-junk-paths选项告诉zip不要存储路径。

zip命令带有文档,告诉你它所有的(许多)选项;输入man zip可以看到这些文档。这并不是zip独有的,你可以通过这种方式获得大多数命令的文档。

评论(16)

在我的例子中,我想把每个文件压缩成自己的档案,所以我做了以下工作(在zsh中)。

$ for file in *; do zip ${file%.*}.zip $file; done
评论(3)

另一种方法是使用find和xargs:(这可能会在zip中包括一个"."目录,但它仍然应该正确解压。在我的测试中,zip在压缩前剥离了圆点) 查找.-type f -exec zip zipfile.zip {}。+

(如果你的find版本不支持exec的+结尾,可以用/;代替+。不过速度会比较慢...)

这将默认包括所有子目录。在GNU find中,`-maxdepth'可以防止这种情况。

评论(1)

另一种(缓慢的)方法(一次只添加一个文件到zip中)。

for f in * .[^.]*; do
    [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
    zip zipfile.zip "$f" # If directories are included, you probably want to add -r
done

这有*的dotfile问题(增加了变通办法),并且会对每个文件启动一次zip,将其添加到档案中。 在bash中,它将处理大量的文件。

它将比大多数其他方法慢,但相对简单。

评论(4)