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


13

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


如果您需要长期处理此目录结构,请将该目录拆分成多个目录。例如,基于文件修改时间或文件名。
2015年

是的,我必须长期工作。现在已经提取了它们,我想根据它们的名称将它们细分为三个文件夹。是否有执行此操作的shell脚本?
莉莉·夏普顿

我建议您在此处搜索类似的问题。如果找不到适合您需求的产品,请提出您自己的新问题。
2015年

Answers:


25
find . -name '*.pdb.gz' -exec gunzip {} +

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


3
find,少gunzip
2015年

2
请注意,“ +”是GNUism,因此不适用于* BSD之类的非GNU系统。
恢复莫妮卡-M.Schröder'15

3
BSD的更高版本find允许使用“ +”符号。例如,请参见BSD 10.1 find手册页。也适用于OS X(至少为10.9和更高版本,也许更早)。
血浆

7

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

find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip

这是否与-execdir gunzip "{}" \;xargs将为每个文件分别调用gunzip的效率相同?那是我阅读手册页。
gogoud 2015年

5
不,xargs将填充尽可能多的gunzip命令行中的文件名。尝试一下!echo a b c d e f | xargs echo只有所调用echo一次与所有6个参数,所以你看到的输出(相当无用的命令来执行,虽然!!!!)的一条线,而如果强制xargs只能每使用命令的调用提供多达3个参数echo a b c d e f | xargs -n 3 echo,那么你得到2行输出。
Celada

4
使用的另一个好处xargs是,使用该-P选件,您可以gunzip并行运行多个进程,这可能会更快(取决于系统的确切参数)。
psmears,2015年

感谢您指向-P@psmears 的指针。现在我也学到了一些东西!
Celada 2015年

1

我认为这应该可行,它将每个文件的路径/名称分别传递给gunzip进行处理:

find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;

1
每个文件将执行一次gunzip。请参阅John1024的答案,以一种稍微不同的方式避免这种低效率。
Celada

@Celada这是故意的;我担心的是,由于gunzip过载,使用+可能会再次导致错误消息。如果John1024的方法有效,则从技术上讲它会更有效,但如果John1024的方法无效,则我的方法应该有效。
gogoud 2015年

1
find+xargs是明确的设计师在考虑究竟该问题。它们将始终提供尽可能多的参数,同时不会超出操作系统的限制。顺便说一下,因为这操作系统的限制,所以与无关gunzip
Celada

1
@Celada好的,感谢您提供的信息,因此大概是用'+'gunzip可能会被调用多次,但是少于320,000次?
gogoud 2015年

1
正确。
Celada


1

如果您有多核计算机,则可能会看到使用gunzip不会最大程度地发挥计算机的功能。为此,您需要gunzip并行运行多个。要跟踪哪个终端手工完成是很麻烦的,但是您可以使用GNU parallel轻松地做到这一点:

find . -name "*.gz" | parallel -X gunzip {}

1
那会不会因为参数列表parallel太长而失败?
user253751

@immibis是的,我忘记了原来的问题,我将更新我的帖子
Anthon

还会因为参数列表find太长而失败吗?
user253751

1
是的,但是您要在find的命令行中传递所有文件名。
user253751

似乎今天不是回答问题的好日子,我忘了引用论点了-name
Anthon 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.