我想压缩给定文件夹中的所有文件,但不压缩任何目录:知道如何做到这一点吗?
例如目录X包含文件F1和F2和目录D1和D2。
我怎样才能压缩目录X只拥有F1和F2并不是D1和D2。
答案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
选项传递--fifo
给zip
.您还可以使用.,@,p
仅选择常规、符号链接和命名p
ipes:
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/\*
希望这有帮助!