jeudi 17 décembre 2009

Fichier trop gros pour être déplacé? Utiliser la commande Unix SPLIT pour le partager en des morceaux plus petits

Récemment j'ai rencontré un problème pour rapatrier un gros fichier (4,7Go) d'un serveur vers mon PC, le serveur Apache m'interdisait de télécharger des fichiers aussi gros, la commande qui m'a sauvé (comme il en existe beaucoup sous les systèmes Unix) est SPLIT, qui permet de fragmenter un fichier en plusieurs morceaux.

J'ai un gros fichier nommé gros.tar de 4,7Go je veux le "mettre en pièces" pour par exemple, le télécharger comme dans mon cas, ou pour simplement le déplacer de mon PC vers un autre et que je n'ai qu'un flash disk de 1Go. J'ouvre un terminal, je vais avec cd dans le répertoire contenant ledit fichier, et je tapes:
ubugnu@ubugnu-laptop:~$ split -b 1000000000 gros.tar gros_
split veut dire diviser, -b c'est pour dire quelle doit être la taille en bytes (octets en français, ne pas confondre avec bits) de chacun des petits morceaux, ici en l'occurrence 1000000000 bytes(ou octets)= 1Go, gros.tar est le nom du fichier qu'on veut fragmenter, gros_ est le préfixe que prendront les fichiers fragments.
On se retrouve à la fin avec 5 fichiers fragments, les 4 premiers seront de taille 1Go chacun, et le cinquième prendra ce qui reste, c-à-d 700Mo, ces fichier se nommeront gros_aa gros_ab gros_ac gros_ad et gros_ae (ces suffixes aa, ab, ac, .....,az,ba,bc, ........yz,zz, seront attribués automatiquement)
Maintenant, en 5 navettes (ou 5 flash disks) vous pourrez transporter ce gros fichier d'un PC à un autre :-)

Oui mais comment je fais pour reconstituer mon fichier originale?

Une autre commande Unix est là pour vous, il s'agit de cat (non ce n'est pas un chat :-p), en fait, cat permet d'afficher le contenu d'un fichier sur la sortie standard (un gros mot pour dire votre terminal), on va profiter du fait que par défaut Unix traite les choses par ordre alphabétique pour rediriger le flux de sortie (un autre gros mot pour dire ce qui s'affiche sur votre terminal) vers un fichier (le fichier original ainsi recomposé), voicila commande:
ubugnu@ubugnu-laptop:~$ cat gros_* > gros.tar
La traduction en langage humain:
cat affiche gros_* tout les fragments qui commencent par gros_ et finissent par n'importe quoi (par ordre alphabétique comme tu sais si bien le faire) > vers non pas l'écran mais un fichier nommé gros.tar
Voila voilou :-) vous aurez votre gros fichier transféré d'un PC à un autre.

Remarques:

  1. On aurait pu écrire la première commande :
    ubugnu@ubugnu-laptop:~$ split -b 1GB gros.tar gros_
    GB c'est Go (Gigaoctets) en anglais, il existe aussi ces préfixes pour la taille:b 512, kB 1000, K 1024, MB 1000x1000, M 1024x1024,GB 1000x1000x1000, G 1024x1024x1024, et ainsi de suite pour T, P, E, Z, Y.
  2. On peut aussi fragmenter un fichier texte en fonction du nombre de lignes que doit comporter chaque fragment, la commande est:
    ubugnu@ubugnu-laptop:~$ split -l 100 gros.txt gros_
    On aura des fragments de 100 lignes chacun, si on écrit:
    ubugnu@ubugnu-laptop:~$ split -l gros.txt gros_ ou même split -b gros.txt gros_
    (sans donner la taille) On aura 1000 lignes par défaut.
  3. Donc si on fait un truc de ce genre (sans taille) sur un fichier binaire:
    ubugnu@ubugnu-laptop:~$ split -b gros.tar gros_
    On aura un truc bizarre, des fichiers qui auront plus ou moins la même taille, en fait, chaque segments comporte 1000 lignes en binaire (ce qui n'en fait pas forcément des fichiers égaux par leur tailles, une ligne peut différer d'une autre par sa taille).
  4. Si vous être du genre parano, vous pouvez vérifier que le fichier reconstitué correspond bit par bit au fichier original en calculant leur somme md5 (un chaine de 32 caractères qui est (censée) représenter de façon unique un mot, une phrase, ou un fichier. Un genre de signature), il faut calculer les deux md5sm (ancien et nouveau fichier) et les comparer... À vos calculatrices :-) non je déconne, voici la commande pour calculer le md5sum d'un fichier:
    ubugnu@ubugnu-laptop:~$ md5sum gros.tar
    Rien que ça!Attention, si le fichier est gros le calcul sera long, mais la certitude elle sera aussi grande :-)Vous pouvez aussi rediriger le flux vers un fichier (il recommence avec ses gros mots) pour éviter de l'écrire sur une feuille.
    ubugnu@ubugnu-laptop:~$ md5sum gros.tar > md5old.txt

Exo :

Que donnera la commande: :-)
ubugnu@ubugnu-laptop:~$ cat gros_* | md5sum