2017-10-13 4 views
0

J'essaie de fusionner une énorme quantité de fichiers dont la taille totale est 75Go. Si j'utilise, par exemplecomment fusionner une énorme quantité de fichiers sans créer un nouveau fichier

~$ cat * > out.merge

La taille des deux fichiers équivaut à 150 Go et mon HD n'a pas un tel espace. Alors, comment éviter la duplication des données?

Merci à l'avance ...

+0

Cat deux fichiers à la fois, les supprimer par la suite? – 123

+0

N'est-il pas possible de tout faire en même temps? Probablement que les lots de chats seront très lents. – Nacho

+2

Vous ne voudriez pas le faire sans duplication temporaire, car vous risquez de perdre des données si quelque chose devait mal tourner à mi-chemin. – chepner

Répondre

0

Vous pouvez utiliser une boucle pour que:

for n in * 
do 
    cat "$n" >>out.merge && rm "$n" 
done 

Dans ce cas, la boucle efface le fichier utilisé avant de passer à la suivante. Vous pouvez même renommer le premier fichier comme out.merge puis ajouter le reste d'entre eux pour sauver l'espace de ce premier ...

+0

Je serais enclin à ne supprimer le fichier que si le 'cat' était un succès, c'est-à-dire mettre un' && 'entre' cat' et 'rm'. –

+0

En outre, cela se comportera mal si les noms de fichiers contiennent des espaces ou peuvent être évalués comme globs. Il devrait vraiment être 'cat '$ n" 'et' rm "$ n" '. Il serait probablement aussi sage d'ignorer explicitement 'out.merge' comme un fichier d'entrée; GNU 'cat' vérifie que son entrée et sa sortie sont au même endroit, mais toutes les implémentations ne sont pas aussi robustes. –

+0

Merci pour toutes les suggestions. J'ai omis la vérification explicite de l'existence de 'out.merge' pour des raisons de clarté. Je suppose que 'out.merge' n'existe pas pour commencer. –

0

Vous pouvez essayer cat chaque fichier et ing retirer immédiatement comme

for f in ./*; do cat "$f" && rm "$f"; done > another_dir/out.merge 

bien que cela engendrera encore un nouveau cat pour chaque fichier.

+1

Vous n'avez pas besoin des accolades; la boucle 'for' elle-même peut avoir une redirection de sortie. – chepner

+2

Le seul problème avec cette approche est que si vous commencez à obtenir des erreurs à mi-chemin, vous pouvez supprimer un fichier sans confirmer qu'il a été correctement écrit dans 'out.merge'. – chepner

+2

'cat" $ f "&& rm" $ f "' – 123