Удалите поврежденные архивы 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) как это работает
Другие вопросы по тегам