Удалите поврежденные архивы gz с помощью "xargs rm"
Я хотел бы предварительно обработать каталог файлов.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
или похожие.
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
) как это работает