【问题标题】:Fastest way to check thousands of gzip files检查数千个 gzip 文件的最快方法
【发布时间】:2022-08-18 21:23:06
【问题描述】:

我创建了这个 sn-p 来遍历文件夹并检查是否存在无效的 gz 文件并通过再次 gzip 对其进行修复。 这工作正常,但前提是只有几个文件。如果有数千个文件,这需要很长时间。

有没有更优化的方法来做到这一点。

fix_corrupt_files()
{
  dir=$1
  
  for f in $dir/*.gz
  do
  
  if gzip -t $f;
    then :
  else
    log \"$(basename $f) is corrupt\"
    base=\"$(basename $f .gz)\"
    log \"fixing file\"
    mv $f $dir/$base
    gzip $dir/$base
    log \"file fixed\"
  fi
  
  done
}
  • 命令 mv $f $dir/$basegzip $dir/$base 的目的是什么?似乎您从 gzip 文件中剥离了 .gz 扩展名并重新 gzip 。这没有任何意义,也不会修复损坏的 gzip 文件。
  • \"corrupt\" 可能有点误导对不起。该文件实际上仍然完好无损,我可以“cat”它并且仍然可以看到它的内容。只是即使它是 .gz 格式,它也会抛出 \"not in gzip format\" 错误。这就是为什么我正在做 re-gzip 来修复它。
  • 我想我现在明白了。该文件最初没有被 gzip 压缩,但不知何故得到了 .gz 扩展名。

标签: bash shell unix


【解决方案1】:

这应该给你一点加速:

fix_corrupt_files()
{
  dir="$1"
  
  for f in "$dir"/*.gz
  do 
  {
    if gzip -t "$f";
      then :
    else
      log "$(basename "$f") is corrupt"
      base="$(basename "$f" .gz)"
      log "fixing file"
      mv "$f" "$dir/$base"
      gzip "$dir/$base" &  # run in background
      log "file fixed"
    fi
  } &
  done
  wait # wait for all background processes to terminate
}

请注意,我假设gzip 命令是您的慢速部分。

我在这里真正做的只是在后台运行你的if 语句(使用{...}&)。所以基本上你函数中的每个if 语句都将并行运行。函数末尾有一个wait,因此在所有子流程完成之前它不会离开函数。这可能适合也可能不适合您的用例。另请注意,log 将被随机调用,并且可能会出现乱序。同样,这是否重要取决于您的用例。

另请注意,我在任何地方都添加了双引号应该是。看起来您确信您的文件名中没有空格,但这让我感到焦虑。

编辑: 另请注意,这可能会使您的机器瘫痪。我对gzip 不够熟悉,不知道它的资源密集程度。我也不知道你的档案有多大。如果这成为问题,您可以添加一个循环计数器,每 X 次迭代调用 wait

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 2017-02-12
    • 2020-04-13
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多