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 ?
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
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.
si vous avez un certain type de sortie, faites quelque chose comme ça
cat /path/to/files/*.txt >> finalout.txt
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
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.
Si tous vos fichiers portent le même nom, vous pouvez simplement faire:
cat *.log >> output.log
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
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.
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
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
.