web-dev-qa-db-fra.com

Comment ajouter le contenu de plusieurs fichiers dans un seul fichier

Je veux copier le contenu de cinq fichiers dans un fichier tel quel. J'ai essayé de le faire en utilisant cp pour chaque fichier. Mais cela écrase le contenu copié du fichier précédent. J'ai aussi essayé

paste -d "\n" 1.txt 0.txt

et ça n'a pas marché.

Je veux que mon script ajoute la nouvelle ligne à la fin de chaque fichier texte.

par exemple. Fichiers 1.txt, 2.txt, 3.txt. Mettez le contenu de 1,2,3 dans 0.txt

Comment fait-on ça ?

151
Steam

Vous avez besoin de la commande cat (raccourci pour concaténer), avec la redirection de shell (>) dans votre fichier de sortie.

cat 1.txt 2.txt 3.txt > 0.txt
276
radical7

Une autre option, pour ceux d’entre vous qui tombent encore sur ce message comme moi, est d’utiliser find -exec:

find . -type f -name '*.txt' -exec cat {} + >> output.file

Dans mon cas, j'avais besoin d'une option plus robuste qui parcourrait plusieurs sous-répertoires. J'ai donc choisi d'utiliser find. Le décomposer:

find .

Regardez dans le répertoire de travail actuel.

-type f

Seulement intéressé par les fichiers, pas les répertoires, etc.

-name '*.txt'

Whittle le résultat défini par nom

-exec cat {} +

Exécutez la commande cat pour chaque résultat. "+" signifie que seulement 1 instance de cat est générée (merci @gniourf_gniourf)

 >> output.file

Comme expliqué dans d'autres réponses, ajoutez le contenu catalogué à la fin du fichier de sortie.

89
mopo922

si vous avez un certain type de sortie, faites quelque chose comme ça

cat /path/to/files/*.txt >> finalout.txt
40
Eswar Yaganti

Si tous vos fichiers sont dans un seul répertoire, vous pouvez simplement faire

cat * > 0.txt

Les fichiers 1.txt, 2.txt, .. iront dans 0.txt

16
Pooja
for i in {1..3}; do cat "$i.txt" >> 0.txt; done

J'ai trouvé cette page parce que je devais réunir 952 fichiers en un seul. J'ai trouvé que cela fonctionnait beaucoup mieux si vous aviez plusieurs fichiers. Cela fera une boucle pour le nombre de nombres dont vous avez besoin et sélectionnez chacun d’eux en utilisant >> pour ajouter à la fin de 0.txt.

9
freddythunder

Si tous vos fichiers portent le même nom, vous pouvez simplement faire:

cat *.log >> output.log
6
AeaRy

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 aussi merge.txt (et non 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 de 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 la manière suivante:

sed -n w"merge.txt" {1..3}.txt
4
Fran

Si le fichier d'origine contient des caractères non imprimables, ils seront perdus lors de l'utilisation de la commande cat. Avec 'cat -v', les éléments non imprimables seront convertis en chaînes de caractères visibles, mais le fichier de sortie ne contiendra toujours pas les caractères non imprimables réels dans le fichier d'origine. Avec un petit nombre de fichiers, vous pouvez également ouvrir le premier fichier dans un éditeur (par exemple, vim) qui gère des caractères non imprimables. Puis dirigez-vous vers le bas du fichier et entrez ": r second_nom_fichier". Cela attirera le deuxième fichier, y compris les caractères non imprimables. La même chose pourrait être faite pour des fichiers supplémentaires. Lorsque tous les fichiers ont été lus, entrez ": w". Le résultat final est que le premier fichier contiendra maintenant ce qu’il a fait à l’origine, ainsi que le contenu des fichiers lus.

2
B.A.Cooper

si vos fichiers contiennent en-têtes et que vous souhaitez les supprimer dans le fichier de sortie, vous pouvez utiliser:

for f in `ls *.txt`; do sed '2,$!d' $f >> 0.out; done
2
brunocrt

Si vous souhaitez ajouter le contenu de 3 fichiers dans un seul fichier, la commande suivante sera un bon choix:

cat file1 file2 file3 | tee -a file4 > /dev/null

Il combinera le contenu de tous les fichiers dans file4, en renvoyant la sortie de la console vers /dev/null.

1
Ajit K'sagar