Linux : joindre plusieurs fichiers avec cat sans se tromper

Sous Linux, il arrive souvent de devoir joindre plusieurs fichiers en un seul. Par exemple des morceaux nommés file0001.dat, file0002.dat, file0003.dat, jusqu’à file1000.dat.

Pour ce genre de tâche, la commande cat est parfaite. Elle lit les fichiers dans l’ordre indiqué, puis écrit leur contenu à la suite sur la sortie standard. Il suffit ensuite de rediriger cette sortie vers un nouveau fichier.

La commande de base ressemble à ceci :

cat file*.dat > all_files.datLangage du code : CSS (css)

C’est simple, rapide, disponible sur toutes les distributions Linux, et très pratique. Mais comme souvent avec les commandes simples, il y a deux ou trois pièges cachés sous le tapis.

Kinsta: Premium Managed WordPress hosting

À quoi sert cat ?

La commande cat sert à concaténer des fichiers et à afficher le résultat. Son nom vient de concatenate.

Exemple avec trois fichiers texte :

cat intro.txt chapitre1.txt chapitre2.txt > livre.txtLangage du code : CSS (css)

Le fichier livre.txt contiendra d’abord le contenu de intro.txt, puis celui de chapitre1.txt, puis celui de chapitre2.txt.

cat ne trie pas, ne comprend pas le format, ne nettoie pas les doublons, ne vérifie pas les en-têtes et ne répare pas les fichiers. Il colle simplement les contenus à la suite. Il est très bon à ça. Il ne prétend pas être chef d’orchestre.

Joindre plusieurs fichiers nommés dans l’ordre

Si vos fichiers sont nommés proprement avec des zéros initiaux, la commande est directe :

cat file0001.dat file0002.dat file0003.dat > all_files.datLangage du code : CSS (css)

Pour éviter de tout écrire à la main, utilisez un motif :

cat file*.dat > all_files.datLangage du code : CSS (css)

Avec des fichiers nommés file0001.dat, file0002.dat, file0003.dat, le tri alphabétique fonctionne correctement, car les numéros ont la même longueur.

C’est précisément pour cela que les zéros initiaux sont utiles. Sans eux, l’ordre peut devenir trompeur.

WPEngine: Premium Managed WooCommerce hosting

Attention à l’ordre des fichiers

Le shell développe file*.dat avant d’appeler cat. L’ordre dépend donc du tri appliqué aux noms de fichiers.

Avec ces fichiers :

file1.dat
file2.dat
file10.datLangage du code : CSS (css)

l’ordre alphabétique peut donner :

file1.dat
file10.dat
file2.datLangage du code : CSS (css)

Ce n’est probablement pas ce que vous voulez. Pour éviter ça, nommez vos fichiers avec des zéros initiaux :

file001.dat
file002.dat
file010.datLangage du code : CSS (css)

Ou utilisez un tri naturel avec sort -V, aussi appelé version sort dans GNU Coreutils. Ce tri est justement conçu pour mieux gérer les nombres dans les chaînes de caractères.

printf '%s\n' file*.dat | sort -VLangage du code : JavaScript (javascript)

Pour concaténer dans cet ordre naturel :

printf '%s\n' file*.dat | sort -V | xargs cat > all_files.datLangage du code : JavaScript (javascript)

Cette version est pratique pour des noms simples. Pour des fichiers contenant des espaces, utilisez la version robuste ci-dessous.

Version robuste avec espaces dans les noms

Les noms de fichiers avec espaces, apostrophes ou caractères spéciaux cassent facilement les commandes trop rapides. Pour être plus solide, utilisez find, sort -z et xargs -0.

find . -maxdepth 1 -type f -name 'file*.dat' -print0 \
    | sort -z -V \
    | xargs -0 cat > all_files.datLangage du code : JavaScript (javascript)

Ici, -print0 sépare les noms par un caractère nul au lieu d’un retour ligne. Cela évite les erreurs avec les noms de fichiers contenant des espaces ou des caractères pénibles. Oui, certains noms de fichiers ont manifestement été créés un vendredi soir.

Kinsta: Premium Managed WordPress hosting

Éviter d’inclure le fichier de sortie dans l’entrée

Piège classique : créer le fichier de sortie dans le même dossier avec un nom qui correspond au motif.

Exemple dangereux :

cat *.dat > all.datLangage du code : CSS (css)

Si all.dat correspond au motif *.dat, vous risquez de l’inclure dans l’opération, selon l’état du dossier et le comportement exact de la commande. Le résultat peut vite devenir confus.

Préférez écrire la sortie dans un autre dossier :

mkdir -p output
cat file*.dat > output/all_files.dat

Ou utilisez une extension qui ne correspond pas au motif d’entrée :

cat file*.part > all_files.datLangage du code : CSS (css)

Vérifier les fichiers avant concaténation

Avant de joindre des fichiers, vérifiez l’ordre exact qui sera utilisé.

printf '%s\n' file*.datLangage du code : JavaScript (javascript)

Avec tri naturel :

printf '%s\n' file*.dat | sort -VLangage du code : JavaScript (javascript)

Vérifiez aussi le nombre de fichiers concernés :

printf '%s\n' file*.dat | wc -lLangage du code : JavaScript (javascript)

Et la taille totale approximative :

du -ch file*.dat | tail -n 1

Ces vérifications prennent dix secondes. Elles évitent de découvrir après coup que file0420.dat manquait à l’appel, tranquillement planqué dans un autre dossier.

Kinsta: Premium Managed WordPress hosting

Concaténer des fichiers texte

Pour des fichiers texte simples, cat est idéal.

cat part-01.txt part-02.txt part-03.txt > complet.txtLangage du code : CSS (css)

Si vous voulez ajouter une ligne vide entre chaque fichier, cat seul ne le fera pas. Utilisez une boucle :

for file in part-*.txt; do
    cat "$file"
    printf '\n'
done > complet.txtLangage du code : JavaScript (javascript)

Si les fichiers n’ont pas de retour ligne final, la jonction peut coller deux lignes ensemble. Vérifiez avec :

tail -c 1 part-01.txt | od -An -t x1

Si vous voyez 0a, le fichier se termine par un retour ligne Unix. Sinon, ajoutez-en un si nécessaire.

Concaténer des fichiers CSV

Pour des CSV, attention aux en-têtes. Si chaque fichier commence par la même ligne d’en-tête, un simple cat va répéter cette ligne au milieu du fichier final.

Exemple naïf :

cat export-*.csv > exports-complets.csvLangage du code : CSS (css)

Cette commande fonctionne seulement si les fichiers n’ont pas d’en-têtes répétés, ou si vous acceptez de les garder.

Pour garder l’en-tête du premier fichier uniquement :

first="export-001.csv"

head -n 1 "$first" > exports-complets.csv

for file in export-*.csv; do
    tail -n +2 "$file"
done >> exports-complets.csvLangage du code : JavaScript (javascript)

Cette approche suppose que tous les CSV partagent la même structure. Si les colonnes diffèrent, il faut passer par un vrai traitement CSV, pas une concaténation brute.

Concaténer des fichiers binaires

cat peut aussi concaténer des fichiers binaires. C’est utile pour des fichiers découpés en morceaux, par exemple :

cat archive.part-* > archive.tar.gzLangage du code : CSS (css)

Mais cela ne fonctionne que si les morceaux sont de vraies parties consécutives d’un même fichier. cat ne fusionne pas intelligemment des PDF, des images, des vidéos ou des archives indépendantes.

Par exemple, ceci ne crée pas un PDF propre avec trois documents fusionnés :

cat doc1.pdf doc2.pdf doc3.pdf > final.pdfLangage du code : CSS (css)

Pour fusionner des PDF, utilisez un outil prévu pour cela. Pour assembler des morceaux issus de split, cat est parfait.

Découper puis reconstituer un fichier avec split et cat

Un cas classique consiste à découper un gros fichier avec split, puis à le reconstituer avec cat.

Découper une archive en morceaux de 100 Mo :

split -b 100M archive.tar.gz archive.tar.gz.part-Langage du code : CSS (css)

Vous obtenez des fichiers du type :

archive.tar.gz.part-aa
archive.tar.gz.part-ab
archive.tar.gz.part-acLangage du code : CSS (css)

Pour reconstituer l’archive :

cat archive.tar.gz.part-* > archive-restauree.tar.gzLangage du code : CSS (css)

Vérifiez ensuite l’intégrité avec une somme de contrôle.

Vérifier l’intégrité après concaténation

Pour un fichier important, générez une somme de contrôle avant le découpage ou avant transfert :

sha256sum archive.tar.gz > archive.tar.gz.sha256Langage du code : CSS (css)

Après reconstitution :

sha256sum -c archive.tar.gz.sha256Langage du code : CSS (css)

Si la commande retourne OK, le fichier restauré correspond à l’original.

Sans vérification, vous avez surtout une belle confiance. C’est admirable, mais moins fiable qu’un hash.

Ajouter à un fichier existant avec >>

La redirection > crée ou remplace le fichier de sortie. La redirection >> ajoute à la fin d’un fichier existant.

Créer ou remplacer :

cat part-*.txt > complet.txtLangage du code : CSS (css)

Ajouter à la fin :

cat nouvelles-parties-*.txt >> complet.txtLangage du code : CSS (css)

Attention : > écrase. Une faute de nom peut donc faire disparaître un fichier existant. Le shell ne fait pas de psychologie préventive.

Protéger les fichiers existants avec noclobber

Pour éviter d’écraser un fichier par accident, vous pouvez activer noclobber dans Bash :

set -o noclobberLangage du code : JavaScript (javascript)

Ensuite, cette commande échouera si all_files.dat existe déjà :

cat file*.dat > all_files.datLangage du code : CSS (css)

Pour forcer malgré tout l’écrasement avec noclobber activé :

cat file*.dat >| all_files.dat

C’est utile quand vous travaillez dans un dossier sensible. Ou quand vous connaissez votre tendance à taper vite et réfléchir après. Nous avons tous nos combats.

Quand cat n’est pas le bon outil

cat joint des flux bruts. Il ne comprend pas la structure des formats. Donc il ne convient pas à tous les cas.

BesoinOutil conseillé
Joindre des morceaux d’un même fichiercat
Concaténer des fichiers textecat
Fusionner des CSV avec en-tête uniquehead, tail, boucle shell ou outil CSV
Archiver plusieurs fichierstar ou zip
Fusionner des PDFpdfunite, qpdf ou outil PDF dédié
Concaténer des vidéosffmpeg
Fusionner des imagesImageMagick ou outil graphique

Si votre objectif est de créer une archive contenant plusieurs fichiers distincts, utilisez plutôt tar :

tar -czf archive.tar.gz dossier/

Ou zip :

zip -r archive.zip dossier/

cat colle. tar emballe. Ce n’est pas le même métier.

Exemple complet : assembler des morceaux .dat

Voici un exemple propre pour assembler plusieurs morceaux nommés file0001.dat, file0002.dat, etc.

Vérifier les fichiers :

printf '%s\n' file*.datLangage du code : JavaScript (javascript)

Créer un dossier de sortie :

mkdir -p output

Concaténer :

cat file*.dat > output/all_files.dat

Vérifier la taille :

ls -lh output/all_files.dat

Si vous avez une somme de contrôle :

sha256sum output/all_files.dat

Script Bash réutilisable

Pour éviter les erreurs, voici un petit script plus prudent. Il assemble des fichiers correspondant à un motif et place le résultat dans un dossier output.

#!/usr/bin/env bash

set -euo pipefail

pattern="${1:-file*.dat}"
output_dir="output"
output_file="${output_dir}/all_files.dat"

mkdir -p "$output_dir"

mapfile -d '' files < <(
    find . -maxdepth 1 -type f -name "$pattern" -print0 | sort -z -V
)

if (( ${#files[@]} == 0 )); then
    printf 'Aucun fichier trouvé pour le motif : %s\n' "$pattern" >&2
    exit 1
fi

if [[ -e "$output_file" ]]; then
    printf 'Erreur : le fichier de sortie existe déjà : %s\n' "$output_file" >&2
    exit 1
fi

cat "${files[@]}" > "$output_file"

printf 'Fichier créé : %s\n' "$output_file"Langage du code : PHP (php)

Enregistrez-le, par exemple sous join-files.sh, puis rendez-le exécutable :

chmod +x join-files.shLangage du code : CSS (css)

Lancez-le avec le motif par défaut :

./join-files.sh

Ou avec un motif personnalisé :

./join-files.sh 'archive.part-*'Langage du code : JavaScript (javascript)

Checklist avant de joindre des fichiers

  • Vérifiez l’ordre des fichiers avant concaténation.
  • Utilisez des zéros initiaux dans les noms : 001, 002, 010.
  • Écrivez le fichier final dans un dossier séparé.
  • Évitez d’inclure le fichier de sortie dans le motif d’entrée.
  • Utilisez sort -V si les nombres n’ont pas tous la même longueur.
  • Pour les noms avec espaces, utilisez find -print0 et xargs -0.
  • Pour les CSV, gérez les en-têtes.
  • Pour les fichiers importants, vérifiez avec sha256sum.
  • Pour archiver plusieurs fichiers, préférez tar ou zip.

Articles liés sur SkyMinds

À retenir

Pour joindre plusieurs fichiers sous Linux, la commande de base reste :

cat file*.dat > all_files.datLangage du code : CSS (css)

Elle fonctionne très bien si les fichiers sont dans le bon ordre et s’il s’agit réellement de concaténer des contenus bruts.

Pour un usage plus sûr, vérifiez l’ordre, placez la sortie dans un dossier séparé, gérez les noms avec espaces, et utilisez un outil spécialisé quand le format l’exige. cat est excellent pour coller des fichiers. Il ne devient pas magicien parce qu’on lui donne un PDF ou une vidéo à manger.

Sources

Demandez à l'IA son opinion
Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

Laisser un commentaire