Answers:
find . -name '*.pdb.gz' -exec gunzip {} +
-exec gunzip {} +将gunzip在其命令行上提供许多但不是太多的文件名。这比为每个文件-exec gunzip {} \;启动一个新gunzip进程的效率更高。
find,少gunzip!
每当遇到“参数列表过长”错误时,都可以通过多次调用所需命令来解决该问题,每次都使用要使用的部分参数。xargs是可以帮助您自动执行此操作的工具。
find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip
-execdir gunzip "{}" \;xargs将为每个文件分别调用gunzip的效率相同?那是我阅读手册页。
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行输出。
xargs是,使用该-P选件,您可以gunzip并行运行多个进程,这可能会更快(取决于系统的确切参数)。
-P@psmears 的指针。现在我也学到了一些东西!
我认为这应该可行,它将每个文件的路径/名称分别传递给gunzip进行处理:
find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;
find同+和xargs是明确的设计师在考虑究竟该问题。它们将始终提供尽可能多的参数,同时不会超出操作系统的限制。顺便说一下,因为这是操作系统的限制,所以与无关gunzip。
尝试这种方式:
find . -name '*.gz' -exec gunzip {} \;
gunzip每个文件将执行一次。请参阅John1024的答案,以一种略有不同的方式避免这种低效率。
如果您有多核计算机,则可能会看到使用gunzip不会最大程度地发挥计算机的功能。为此,您需要gunzip并行运行多个。要跟踪哪个终端手工完成是很麻烦的,但是您可以使用GNU parallel轻松地做到这一点:
find . -name "*.gz" | parallel -X gunzip {}
parallel太长而失败?
find太长而失败吗?
find的命令行中传递所有文件名。
-name
find因为您没有提到子文件夹,所以没有必要使用它。您需要做的是:
for f in *.gz;do gunzip $f;done
find,如果你不想产卵320116个gunzip过程,就这样循环做。