如何通过终端创建没有隐藏文件的整个目录的zip存档?


219

我有一个项目,其中有很多隐藏的文件夹/文件。我想为其创建一个zip归档文件,但归档文件中不应包含任何隐藏的文件夹/文件。如果隐藏文件夹中的文件未隐藏,则也不应包含这些文件。

我知道我可以创建一个目录的zip存档,如下所示:

zip -r zipfile.zip directory

我也知道我可以使用-x选项排除文件,所以我认为这可能有效:

zip -r zipfile.zip directory -x .*

没用 所有隐藏的目录仍在zip文件中。

Answers:


107

这也排除了未隐藏目录中的隐藏文件:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@

2
感谢您的回答。命令(find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@)比预期的要长,但可以正常工作。子目录也包括在内,因此+1和一个可接受的答案:-)
Martin Thoma

103

首先,如果您尚未安装zip,请按照以下步骤进行安装:

sudo apt-get install zip

然后只需创建一个zip文件:

zip -r compressed_filename.zip foldername

如果要排除隐藏文件:

find /folder_path -path '*/.*' -prune -o -type f -print | zip ~/compressed_filename.zip -@

从Zip存档中排除文件 (摘自http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/

创建zip归档文件时,文件排除的基础围绕该-x标志,该标志用于从归档文件中排除与特定名称或模式匹配的文件。最基本的情况如下所示:

zip archive.zip files -x "ExcludeMe"

意味着您可以排除单个文件,说它名为“ Nothanks.jpg”

zip archive.zip images/ -x "Nothanks.jpg"

让我们涵盖一些有用的具体示例。

从Zip存档中排除.DS_Store文件

这将防止通常不可见的Mac元数据.DS_Store 文件包含在zip归档文件中,这些文件默认情况下捆绑在其中:

zip -r archivename.zip archivedirectory -x "*.DS_Store"

但是,如果目录包含子目录,则您将希望使用该命令的另一种形式来从子目录中排除ds_store文件:

zip -r archive.zip directory -x "*/\.DS_Store"

注意:并非所有shell都要求使用引号使此命令正常工作,但是在bash shell(OS X的默认设置)中,您将需要使用引号将通配符和模式排除在外。

从Zip存档中排除特定的文件类型

使用通配符,您还可以通过关注扩展名来排除特定类型的所有文件。例如,此命令将压缩整个目录,减去所有.jpg文件:

zip -r archive.zip directory -x "*.jpg"

可以为文件名中匹配的任何特定文件扩展名或模式进行修改。

从Zip存档中排除.git或.svn目录

压缩目录,减号.git及其内容:

zip -r zipdir.zip directorytozip -x "*.git*"

压缩文件夹,不包括.svn目录:

zip -r zipped.zip directory -x "*.svn*"

从Zip存档中排除所有隐藏文件

由于模式和可以使用通配符,也可以排除由一个时期正在做前缀,所以任何或所有隐藏文件和文件夹,无论是像一个目录.svn或像一个单独的文件.bash_profile.htaccess

zip -r archivename.zip directorytozip -x "*.*"

或从所有子目录中排除所有不可见文件:

zip -r archive.zip directory -x "*/\.*"

5
感谢您为帮助Ubuntu使用者的努力。请记住,在新答案中重新陈述已接受的答案只会增加混乱,并且很可能被标记为删除。
hmayag 2015年

54

添加".*(否则,您的外壳将扩展.*为当前目录中的点文件),并且还排除子目录中的隐藏文件:

zip -r zipfile.zip . -x ".*" -x "*/.*"

这会导致以开头的文件.不会添加到您的zip文件中。

rinzwind@discworld:~/tmp$ ls -la
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 tmp
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 .tmp
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x .*
adding: .tmp/ (stored 0%)
adding: tmp/ (stored 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
updating: tmp/ (stored 0%)

1
我认为您的上一句话不正确。.*会被外壳扩展。
hammar 2011年

1
我认为这可能是正确的,但是我删除了它(不确定):)
Rinzwind

这没有用。该.svn文件的目录添加
马丁托马

1
@moose的排除模式的完整路径,而不仅仅是文件基本名称匹配,所以你需要排除*/.*以及.**/符合目录的任何非空序列)。
吉尔斯2014年

无需更改即可运行!最佳答案。
Whitecat '17

8

这一个包括所有“。” 目录,子目录和“。” 目录中的文件或目录...本质上是第一个答案,但包括顶级“”。文件。

find /full_path -path '*.*/.*' -prune -o -type f -print | zip ~/file.zip -@

8

排除以开头的所有文件夹的示例。:

tar cvpzf folder.tgz folder/ --exclude '.*'

压缩效果更好,但速度较慢:

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'


4

在压缩目录以外的某些文件时:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"

3

目录中没有隐藏的文件夹和文件:

zip -r zipfile.zip directory/*

目录: |── .git │   ├── src │   └── Work.file ├── .test │   └── .file └── test.file

$ zip -r zipfile.zip directory/*
adding: directory/src/ (stored 0%)
adding: directory/src/Work.file (stored 0%)
adding: directory/test.file (stored 0%)
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.