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.
À 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.
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.
É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.
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.
| Besoin | Outil conseillé |
|---|---|
| Joindre des morceaux d’un même fichier | cat |
| Concaténer des fichiers texte | cat |
| Fusionner des CSV avec en-tête unique | head, tail, boucle shell ou outil CSV |
| Archiver plusieurs fichiers | tar ou zip |
| Fusionner des PDF | pdfunite, qpdf ou outil PDF dédié |
| Concaténer des vidéos | ffmpeg |
| Fusionner des images | ImageMagick 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 -Vsi les nombres n’ont pas tous la même longueur. - Pour les noms avec espaces, utilisez
find -print0etxargs -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
tarouzip.
Articles liés sur SkyMinds
- Linux : renommer des fichiers en masse avec Thunar Bulk Renamer
- Linux : vider un fichier avec truncate
- Bash : message “there are stopped jobs” à la fermeture du terminal
- Transférer des fichiers d’un serveur à un autre avec rsync sous Linux
À 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.



