Linux / Commande split : diviser un fichier et vérifier sa reconstruction

split divise un fichier en plusieurs morceaux selon un nombre de lignes ou une taille en octets. Il conserve le fichier d'entrée et crée de nouveaux fichiers dont les noms indiquent l'ordre. Pour retrouver l'original, concaténez tous les morceaux dans cet ordre, puis vérifiez le résultat.

Par défaut, GNU split produit des morceaux de 1 000 lignes, avec un préfixe x et des suffixes comme aa et ab. Choisissez un répertoire neuf et un préfixe distinct pour chaque opération : des morceaux portant déjà les mêmes noms peuvent être écrasés, et d'anciens morceaux supplémentaires peuvent fausser une reconstruction.

Préparer une première division par lignes

split [options] [entrée [préfixe]]

Les exemples utilisent GNU split dans Bash. Consultez man split pour votre système. Créez un répertoire d'exercice neuf :

split_lab=$(mktemp -d "$HOME/split-lab.XXXXXX")
cd -- "$split_lab"
printf 'a\nb\nc\nd\n' > data.txt
split -l 2 data.txt lines-
printf '%s\n' lines-*
cat lines-aa
cat lines-ab

Les noms affichés sont lines-aa puis lines-ab. Le premier fichier contient a et b ; le second contient c et d. Split lui-même n'affiche pas la liste des fichiers créés : c'est le printf de l'exemple qui le fait. Le fichier data.txt conserve ses quatre lignes.

Pour un vrai fichier à diviser par lots de 500 lignes, la forme correspondante est split -l 500 data.txt nouveau-prefixe-. Le dernier morceau contient les lignes restantes et peut donc être plus petit. Notez le chemin du répertoire d'exercice ; vous pourrez ensuite le quitter avec cd "$HOME".

Lire directement l'entrée standard

Le nom d'entrée - représente le flux reçu sur l'entrée standard. Pour reprendre les quatre lignes sans créer de nouveau fichier source :

printf 'a\nb\nc\nd\n' | split -l 2 - part-
cat part-aa
cat part-ab
a
b
c
d

Le préfixe part- est distinct de lines-, ce qui permet de garder les deux essais séparés. Le tiret placé avant ce préfixe désigne l'entrée ; il ne fait pas partie des options.

Reconstituer et contrôler le texte

cat lines-aa lines-ab > data-restored.txt
cmp data.txt data-restored.txt
sha256sum data.txt data-restored.txt

Cat concatène les morceaux sans ajouter de séparateur. Cmp vérifie l'égalité des octets et reste silencieux si les fichiers sont identiques. Les deux empreintes SHA-256 affichées doivent également être les mêmes ; leurs noms de fichiers restent différents.

Une taille identique ne suffit pas à prouver une reconstruction correcte : une inversion ou une modification peut conserver le nombre d'octets. Si les morceaux ont été transférés vers une autre machine, conservez l'empreinte de l'original séparément pour vérifier le fichier reconstitué à destination.

Découper un fichier binaire par octets

-b fixe le nombre d'octets par morceau, indépendamment des lignes. Ce petit fichier binaire de 12 octets permet de tester la division sans produire de gros fichiers :

printf '\000\001\002\003\004\005\006\007\010\011\012\377' > archive.bin
split -b 4 -d -a 3 --additional-suffix=.bin archive.bin archive-part-
printf '%s\n' archive-part-*
wc -c archive-part-*.bin

Les fichiers sont archive-part-000.bin, archive-part-001.bin et archive-part-002.bin. Chacun comporte 4 octets, soit 12 au total. -d choisit des chiffres, -a 3 fixe trois positions et --additional-suffix=.bin ajoute cette extension.

Pour un fichier réel, split -b 100M archive.bin autre-prefixe- produit des morceaux de 100 MiB au maximum, avec éventuellement un dernier morceau plus petit. Dans GNU split, M vaut 1 048 576 octets : 100M signifie donc 104 857 600 octets. MB utilise au contraire un facteur décimal et 100MB signifie 100 000 000 octets.

La division ne compresse pas le fichier. Un morceau d'une archive ou d'une image disque n'est pas nécessairement un fichier autonome que l'on peut ouvrir directement. Prévoyez aussi l'espace nécessaire aux morceaux et à la reconstruction tout en conservant l'original utile au contrôle.

Choisir exactement les morceaux à réunir

Pour les trois noms connus de cet exercice, une liste explicite évite toute ambiguïté :

cat archive-part-000.bin archive-part-001.bin archive-part-002.bin > archive-restored.bin
cmp archive.bin archive-restored.bin
sha256sum archive.bin archive-restored.bin

Cmp doit réussir sans message et les empreintes doivent correspondre. Le fichier de sortie possède un nom qui ne commence pas par archive-part-, afin de ne pas être sélectionné comme morceau.

Pour davantage de morceaux, examinez d'abord la sélection et son ordre. Dans ce répertoire d'exercice propre, le motif ne sélectionne que nos trois fichiers et les suffixes ont la même largeur :

(
export LC_ALL=C
printf '%s\n' archive-part-*
cat archive-part-* > archive-restored-glob.bin
cmp archive.bin archive-restored-glob.bin
)

La locale C fixe ici l'ordre de développement du motif dans le shell. Ne généralisez pas cette commande à un répertoire qui contient des anciens morceaux, des copies de sauvegarde ou une destination correspondant au même motif. Vérifiez l'ensemble attendu, son ordre et l'empreinte finale. N'utilisez jamais le fichier original comme destination de la reconstruction.

Choisir les options et les limites de découpage

Option Rôle
-l N Mettre au plus N lignes dans chaque morceau.
-b taille Diviser par octets, quitte à couper une ligne.
-d Utiliser des suffixes numériques.
-a N Fixer la longueur du suffixe généré.
--additional-suffix=texte Ajouter du texte à la fin de chaque nom, avec GNU split.
-C taille Avec GNU split, essayer de conserver les lignes dans une limite d'octets.

-b peut couper au milieu d'une ligne ou d'un caractère multioctet : la reconstruction des octets reste possible, mais un morceau isolé peut ne pas être un texte valide. Pour conserver les lignes, préférez -l. L'option GNU -C garde autant de lignes entières que possible dans la taille fixée, mais coupe aussi une ligne si elle dépasse à elle seule cette taille ; elle ne garantit donc pas des lignes intactes dans tous les cas.

Avec une longueur de suffixe explicitement limitée, vérifiez que suffisamment de noms sont disponibles pour le nombre de morceaux prévu. Une erreur en cours d'opération n'efface pas nécessairement les fichiers déjà créés : contrôlez le statut et la liste complète avant de transférer ou de reconstruire. Le manuel officiel de GNU split précise les unités, les suffixes et les autres modes de division.