【问题标题】:Delete corrupt gz archives with "xargs rm"使用“xargs rm”删除损坏的 gz 档案
【发布时间】:2017-05-15 06:41:33
【问题描述】:

我想在将 .gz 文件提交到 Hadoop/Spark 之前对其进行预处理。这是为了避免问题,例如these ones。以下 bash 管道几乎可以满足我的需要,除了 xargs rm 似乎没有删除未通过 gunzip -t 测试的文件。

gunzip -t *.gz 2>&1 | cut -f 2 -d: - | xargs rm

管道静默工作。然而,当再次调用 gunzip -t *.gz 时,它会打印出来

gzip: unhappy.gz: unexpected end of file

或类似的。

【问题讨论】:

  • 当我用简单的echo > test.gz 创建的虚假test.gz 测试它时,您的确切命令工作正常。您需要提供有关问题所在的更多详细信息。是否显示任何错误消息?提供给xargs rm 的输入是什么?如果您手动使用完全相同的输入调用xargs rm,会发生什么情况?
  • 当有多个损坏的输入文件时,问题似乎出现了。
  • 不相关,但如果数据有价值,您是否尝试过 gzrecover?
  • @RicardoBranco 不,但这很有意义。就我而言,错误是由下载中断引起的。使用gzrecover 可以节省不必要的下载。

标签: bash xargs gunzip


【解决方案1】:

由于某种原因,这看起来好像只删除了一个文件,然后完成。调用xargs 两次的(更复杂的)管道似乎工作得更可靠:

ls *.gz | xargs -n 1 gunzip -t 2>&1 | cut -f 2 -d: - | xargs -t -n 1 rm

分解,这条管道说:

  • ls *.gz:列出所有.gz文件
  • xargs -n 1 gunzip -t 2>&1:将该列表一次发送一个 (-n 1) 到 gunzip -t,以测试输入
  • cut -f 2 -d: -:从gunzip的输出中提取文件名,这是:字符分隔的行的第二个字段(-f 2
  • xargs -t -n 1 rm:将cut 的输出一次发送一个文件名到rm,并在运行时打印出进度(-t

【讨论】:

    猜你喜欢
    • 2017-08-07
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多