提取文件夹中包含的 .gz 文件

Lil*_*ton 13 shell

我有一个包含大约 320116 个 .pdb.gz 文件的文件夹。我想把它们全部解压缩。如果我使用 gunzip *.gz 它会给我一个错误,即参数列表太长。该文件夹大约为 2GB。请给我一个合适的建议。

Joh*_*024 25

find . -name '*.pdb.gz' -exec gunzip {} +
Run Code Online (Sandbox Code Playgroud)

-exec gunzip {} +gunzip在其命令行上提供许多但不会太多的文件名。这比为每个文件-exec gunzip {} \;启动一个新gunzip进程更有效。

  • 一个`find`,更少`gunzip`! (3认同)
  • 更高版本的 BSD `find` 允许使用“+”符号。例如,参见 [BSD 10.1 的 `find` 手册页](https://www.freebsd.org/cgi/man.cgi?query=find&manpath=FreeBSD+10.1-RELEASE)。也适用于 OS X(至少 10.9 及更高版本,可能更早)。 (3认同)
  • 请注意,“+”是 GNU 主义,因此不适用于 *BSD 等非 GNU 系统。 (2认同)

Cel*_*ada 7

每当您遇到“参数列表太长”错误时,您可以通过多次调用所需的命令来解决它,每次使用您要使用的参数子集。xargs是一种帮助您自动执行此操作的工具。

find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip
Run Code Online (Sandbox Code Playgroud)

  • 不,`xargs` 会在`gunzip` 命令行中填充尽可能多的文件名。尝试一下!`回声abcdef | xargs echo` 仅使用所有 6 个参数调用一次 `echo`,因此您会看到一行输出(尽管执行该命令非常无用!!!!)而如果您强制 `xargs` 每次调用只提供最多 3 个参数命令使用`echo abcdef | xargs -n 3 echo` 然后你会得到 2 行输出。 (5认同)
  • 使用 `xargs` 的另一个优点是,使用 `-P` 选项,你可以并行运行多个 `gunzip` 进程,这(取决于你系统的确切参数)可能会更快。 (4认同)