web-dev-qa-db-fra.com

Comment fusionner tous les fichiers (texte) d'un répertoire en un seul?

J'ai 14 fichiers faisant tous partie d'un même texte. Je voudrais les fusionner en un seul. Comment faire ça?

99
Ivan

C'est techniquement ce que cat ("concaténer") est censé faire, même si la plupart des gens l'utilisent simplement pour sortir des fichiers vers stdout. Si vous lui donnez plusieurs noms de fichiers, ils les afficheront tous de manière séquentielle, puis vous pourrez les rediriger vers un nouveau fichier; dans le cas de tous les fichiers, utilisez simplement * (ou /path/to/directory/* si vous n'êtes pas déjà dans le répertoire) et votre Shell le développera à tous les noms de fichiers

$ cat * > merged-file
182
Michael Mrozek

Si vos fichiers ne se trouvent pas dans le même répertoire, vous pouvez utiliser la commande find avant la concaténation:

find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file

Très utile lorsque vos fichiers sont déjà commandés et que vous souhaitez les fusionner pour les analyser.


Plus facilement:

find /path/to/directory/ -name *.csv -exec cat {} + > merged.file

Cela peut ou non préserver l'ordre des fichiers.

27
3nrique0

La commande

$ cat * > merged-file

a en fait l'effet secondaire indésirable d'inclure "fichier fusionné" dans la concaténation, créant un fichier de fuite. Pour contourner ce problème, écrivez le fichier fusionné dans un répertoire différent;

$ cat * > ../merged-file

ou utilisez une correspondance de modèle qui ignorera le fichier fusionné;

$ cat *.txt > merged-file
10
Christopher Jones

Comme les autres d'ici, dites ... Vous pouvez utiliser cat

Disons que vous avez:

~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD

Et vous voulez seulement file01 à file03 et fileA à fileC:

cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file

Ou, en utilisant l'expansion d'accolade:

cat ~/file0{1..3} ~/file{A..C} > merged-file

Ou, en utilisant l'expansion de l'attelle plus sophistiquée:

cat ~/file{0{1..3},{A..C}} > merged-file

Ou vous pouvez utiliser la boucle for:

for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
10
Florin Idita

Vous pouvez spécifier le pattern d'un fichier puis les fusionner comme suit:

cat *pattern* >> mergedfile
0
user182845

Une autre option est sed:

sed r 1.txt 2.txt 3.txt > merge.txt 

Ou...

sed h 1.txt 2.txt 3.txt > merge.txt 

Ou...

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here

Ou sans redirection ...

 sed wmerge.txt 1.txt 2.txt 3.txt

Notez que la dernière ligne écrit également merge.txt (pas wmerge.txt!). Vous pouvez utiliser w "merge.txt" pour éviter toute confusion avec le nom du fichier et -n pour une sortie silencieuse.

Bien sûr, vous pouvez également raccourcir la liste des fichiers avec des caractères génériques. Par exemple, dans le cas de fichiers numérotés comme dans les exemples ci-dessus, vous pouvez spécifier la plage avec des accolades de cette manière:

sed -n w"merge.txt" {1..3}.txt
0
Harini