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

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

我有一个项目,里面有很多隐藏文件夹/文件。我想创建一个 zip 存档,但存档中不应该有任何隐藏文件夹/文件。如果隐藏文件夹中的文件没有被隐藏,它们也不应该被包括在内。

我知道我可以创建一个像这样的目录的 zip 存档:

zip -r zipfile.zip directory

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

zip -r zipfile.zip directory -x .*

它不起作用。所有隐藏目录仍在 zip 文件中。

答案1

首先,如果您还没有安装 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 存档中:

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 "*/\.*"

答案2

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

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

答案3

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

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%)

答案4

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

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

相关内容