程序“zip”有一个 -R 功能,允许用户压缩目录树中具有特定名称的所有文件:zip -rv/s zip -R
例如:
zip -R bigfile "bigfile"
将压缩以下所有内容:
./bigfile
./a/bigfile
./a/b/bigfile
./a/b/c/bigfile
.......
不过,-R 功能似乎不在 gzip 或 xz 中。我已经尝试过,并且还检查了手册页。
那么我如何在 gzip 和 xz 中模拟这种行为呢?
答案1
结合find
,tar
和压缩实用程序:
和gzip
:
find . -type f -name bigfile | tar cfz bigfile.tgz -T -
或与xz
:
find . -type f -name bigfile | tar cfJ bigfile.txz -T -
find
递归搜索bigfile
当前/工作目录下的所有文件,并将结果路径名提供给tar
创建 tarball 并压缩它。
这些命令适合问题中提供的示例。提供给 的不同模式zip -R
将需要提供给 的相应参数find
。
另请记住,这不适用于所有可能的文件名;您应该考虑 --null 选项并从 find -print0 中提供 tar。
另外,tar
“-T”选项并非在每个系统上都可用(例如在 HP-UX 中)。
编辑1
例如,与 zip、rar 或 7-zip 不同,gzip 和 xz 无法将多个文件压缩为一个文件。
引用 gzip 手册页:
如果您希望创建包含多个成员的单个存档文件,以便以后可以独立提取成员,请使用 tar 或 zip 等存档程序。 GNU tar 支持 -z 选项来透明地调用 gzip。 gzip 被设计为 tar 的补充,而不是替代品。
看如何将多个文件gzip到一个gz文件中?和如何将多个文件压缩为 .xz 存档?。
编辑2
如果OP的目标是为它发现满足搜索条件的每个文件创建一个gzip文件,则应发出以下命令:
find . -type f -name bigfile | gzip > bigfile.gz
对于 xz 文件:
find . -type f -name bigfile | xz > bigfile.xz
它将在同一目录中为满足搜索条件的每个文件创建一个压缩文件,而原始文件“不变”。
编辑3
正如建议的@Kusalananda,如果bash
你首先这样做:
shopt -s globstar
然后发出命令:
tar -c -zf bigfile.tgz ./**/bigfile
将使用子目录中满足搜索条件的多个文件创建一个存档文件。
如果目标是为子目录中找到的每个满足搜索条件的文件创建一个压缩文件,则在发出命令后shopt
,您只需发出:
gzip ./**/bigfile