压缩文件夹中的所有文件但排除所有子文件夹

压缩文件夹中的所有文件但排除所有子文件夹

我想压缩给定文件夹中的所有文件,但不压缩任何目录:知道如何做到这一点吗?

例如目录X包含文件F1F2和目录D1D2
我怎样才能压缩目录X只拥有F1F2并不是D1D2

答案1

解决这个问题的一种方法是使用zip的排除选项:

zip /path/to/zip/file.zip /path/to/given/folder/* -x /path/to/given/folder/*/

这告诉zip我们归档 /path/to/given/folder 中的所有内容,但也排除该文件夹中的所有内容(目录)。这里是 shell 通过通配符执行工作,将以斜杠结尾的通配符扩展到该文件夹​​中的目录列表。如果该目录中有点文件,则必须单独展开它们 - 并且还要排除任何“点目录”。

答案2

对于 GNUfind或兼容版本,假设没有包含换行符的文件名:

find X -maxdepth 1 -type f | zip -nw -@ X.zip

-@选项从标准输入获取文件列表,每行一个文件。-nw(或--no-wild) 关闭 , 的通配符扩展zip,以避免包含*,?[字符的文件名出现问题。

答案3

zsh

zip -nw X.zip X X/*(ND.)

将存储X常规文件(带有. 全局限定符将其中包含的隐藏内容 ( )按词汇顺序D放入压缩档案中。X.zip

而不是.选择哪个常规的仅文件,您可以使用^/它选择任何类型的文件除了目录,包括符号链接、fifo、设备、套接字。但其中,zip 格式(不太像 Unix 格式)只能存储符号链接和 fifo(命名管道),并且您需要将 和--symlinks选项传递--fifozip.您还可以使用.,@,p仅选择常规、符号链接和命名pipes:

zip --symlinks --fifo -nw X.zip X/*(ND.,@,p)

答案4

如果我们想在压缩时转义特定的子文件夹,我们需要使用*反斜杠(\)对其进行转义,以便 shell 将其视为文字字符(而不是扩展为文件列表),在这边走:

zip /path/to/zip/file.zip /path/to/given/folder/* -x /path/to/given/folder/subfolder/\*

希望这有帮助!

相关内容