2017-05-14 2 views
0

Je voudrais prétraiter un répertoire de fichiers .gz avant de les soumettre à Hadoop/Spark. C'est pour éviter les problèmes, tels que theseones. Le pipeline de bash suivant presque fait ce dont j'ai besoin, sauf que xargs rm ne semble pas supprimer les fichiers qui échouent le test gunzip -t.Supprimer les archives gz corrompues avec "xargs rm"

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

Le pipeline fonctionne en mode silencieux. Pourtant, quand gunzip -t *.gz est appelé à nouveau, il imprime

gzip: unhappy.gz: unexpected end of file 

ou similaire.

+1

Votre commande exacte fonctionne très bien lorsque je la teste avec un faux 'test.gz' créé simplement avec 'echo> test.gz'. Vous devrez fournir plus de détails sur ce qui ne va pas. Des messages d'erreur sont-ils affichés? Quelle est l'entrée fournie à 'xargs rm'? Que se passe-t-il si vous appelez 'xargs rm' avec cette même entrée manuellement? – hvd

+0

Il semble que le problème se pose lorsqu'il y a plus d'un fichier d'entrée corrompu. –

+0

Non apparenté mais, si les données sont valables, avez-vous essayé gzrecover? –

Répondre

0

Pour une raison quelconque, il semble que cela ne supprime qu'un fichier, puis se termine. Un (plus complexe) pipeline qui invoque xargs semble deux fois travailler beaucoup plus fiable:

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

Decomposed, ce pipeline dit:

  • ls *.gz: liste tous .gz fichiers
  • xargs -n 1 gunzip -t 2>&1: envoyer cette liste un à la fois (-n 1) à gunzip -t, à test l'entrée
  • cut -f 2 -d: -: extraire le nom du fichier à partir de la sortie du gunzip, qui est le second champ (-f 2) de la ligne délimitée par : caractère
  • xargs -t -n 1 rm: envoyer la sortie de cut à rm un nom de fichier à la fois, l'impression de progrès (-t) comme il fonctionne