我想在将.gz文件提交到Hadoop/Spark之前对其进行预处理。这是为了避免这些问题,例如这些问题。下面的 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
或类似。
出于某种原因,这似乎只删除了一个文件,然后完成。调用两次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
(