web-dev-qa-db-fra.com

Concaténation de plusieurs fichiers texte en un seul fichier dans Bash

Quel est le moyen le plus rapide et le plus pragmatique de combiner tous les fichiers * .txt d’un répertoire en un seul fichier texte?

Actuellement, j'utilise Windows avec cygwin, j'ai donc accès à BASH.

La commande Windows Shell serait bien aussi mais je doute qu'il en existe un.

261
Yada

Cela ajoute la sortie à tout.txt

cat *.txt >> all.txt

Cela écrase all.txt

cat *.txt > all.txt
465
Robert Greiner

N'oubliez pas que pour toutes les solutions données jusqu'à présent, le shell décide de l'ordre dans lequel les fichiers sont concaténés. Pour Bash, IIRC, c'est l'ordre alphabétique. Si l'ordre est important, vous devez nommer les fichiers de manière appropriée (01file.txt, 02file.txt, etc.) ou spécifier chaque fichier dans l'ordre que vous souhaitez concaténer.

$ cat file1 file2 file3 file4 file5 file6 > out.txt
127
Chinmay Kanchi

La commande shell Windows type peut faire ceci:

type *.txt >outputfile

La commande de type type écrit également les noms de fichier sur stderr, qui ne sont pas capturés par l'opérateur de redirection > (mais s'afficheront sur la console).

33
Greg Hewgill

Vous pouvez utiliser Windows Shell copy pour concaténer des fichiers.

C:\> copy *.txt outputfile

De l'aide:

Pour ajouter des fichiers, spécifiez un fichier unique pour la destination, mais plusieurs fichiers pour la source (en utilisant des caractères génériques ou le format fichier1 + fichier2 + fichier3).

25
Carl Norum

la manière la plus pragmatique avec Shell est la commande cat. d'autres moyens incluent,

awk '1' *.txt > all.txt
Perl -ne 'print;' *.txt > all.txt
6
ghostdog74

Soyez prudent, car aucune de ces méthodes ne fonctionne avec un grand nombre de fichiers. Personnellement, j'ai utilisé cette ligne:

for i in $(ls | grep ".txt");do cat $i >> output.txt;done

EDIT: Comme quelqu'un l'a dit dans les commentaires, vous pouvez remplacer $(ls | grep ".txt") par $(ls *.txt)

EDIT: grâce à l’expertise de @gnourf_gnourf, l’utilisation de glob est la méthode correcte pour parcourir les fichiers d’un répertoire. Par conséquent, les expressions blasphématoires telles que $(ls | grep ".txt") doivent être remplacées par *.txt (voir l'article ici ).

Bonne solution

for i in *.txt;do cat $i >> output.txt;done
5
Jacobe2169

Que diriez-vous de cette approche?

find . -type f -name '*.txt' -exec cat {} + >> output.txt
4
GPrathap
type [source folder]\*.[File extension] > [destination folder]\[file name].[File extension]

Par exemple:

type C:\*.txt > C:\1\all.txt

Cela va prendre tous les fichiers txt dans le dossier C:\et les sauvegarder dans le dossier C:\1 sous le nom all.txt

Ou

type [source folder]\* > [destination folder]\[file name].[File extension]

Par exemple:

type C:\* > C:\1\all.txt

Cela prendra tous les fichiers présents dans le dossier et y mettra le contenu dans C:\1\all.txt

3
Ori

Lorsque vous rencontrez un problème dans lequel all.txt se loge dans all.txt, vous pouvez essayer de vérifier si all.txt est existant ou non. S'il existe, supprimez

Comme ça:

[ -e $"all.txt" ] && rm $"all.txt"

0
leo

Vous pouvez faire comme ceci: cat [directory_path]/**/*.[h,m] > test.txt

si vous utilisez {} pour inclure l’extension des fichiers à rechercher, il existe un problème de séquencement.

0
Michael-zhang