web-dev-qa-db-fra.com

Comment joindre des fichiers texte?

J'ai enregistré de nombreux documents au format txt. Je veux les imprimer ensemble, donc je les veux d’abord dans un seul fichier. L'ordre n'a pas d'importance dans ce cas.

Je souhaite une solution qui n'implique pas la saisie des noms des fichiers à fusionner, mais une solution qui fusionne simplement tous les fichiers txt du dossier.

Puis-je le faire avec une commande ou une interface graphique?


J'ai regardé ici . Je ne sais pas comment utiliser join.

21
user47206

Utilisez cat avec la redirection de sortie. Syntaxe: cat file [file] [[file] ...] > joined-file.

Exemple avec seulement deux fichiers (vous pouvez en avoir beaucoup plus):

$ echo "some text in a file" > file1
$ echo "another file with some text" > file2
$ cat file1 file2 > mergedfiles
$ cat mergedfiles
some text in a file
another file with some text

Si vous avez "plusieurs documents", utilisez Shell globbing (patterns):

cat input-files-dir/* > joined-file

Cela joindra tous les fichiers de ce répertoire au répertoire actuel (l'empêchant de correspondre au fichier de sortie lui-même). Il est totalement indépendant de l'utilisation de cat et de la redirection de la sortie. Bash fournit simplement tous les fichiers en tant qu'arguments pour cat.


Types de fichier

Il s'agira simplement de coller (joindre) des fichiers comme vous le feriez avec du papier et du ruban adhésif. Peu importe que le format de fichier soit capable de gérer cela. Cela fonctionnera pour les fichiers texte, mais pas pour les PDF, les ODT, etc. Eh bien, cela les collera ensemble, mais ce n'est plus un PDF/ODT valide.


Ordre de rejoindre

Comme phoibos a souligné , l'éclaboussement du shell aura pour résultat l'ordre alphabétique des noms de fichiers. Voici comment fonctionne Bash et Shell Globbing.


Addendum sur l'erreur input file is output file

Lorsque le modèle des fichiers d'entrée correspond exactement au même fichier que celui en cours de sortie, une erreur est générée. C'est un élément de sécurité. Exemple: cat *.txt > out.txt exécuté la deuxième fois provoquera ceci.

Que pouvez-vous faire à ce sujet:

  • Choisissez un modèle plus spécifique pour correspondre aux fichiers d'entrée réels, ne correspondant pas au nom de sortie. Exemple: le modèle de fichier d'entrée *.txt avec le fichier de sortie output.out ne sera pas en collision.
  • Travailler dans des répertoires différents. Dans l'exemple ci-dessus, j'ai utilisé un répertoire séparé input-files-dir pour y placer tous les fichiers et l'afficher dans le répertoire de travail en cours. Cela rend impossible d'obtenir cette erreur.
43
gertvdijk

Un moyen simple de le faire est d'utiliser cat:

cat file1 file2 > joined_file

Si vous émettez simplement cat file1 file2, vous verrez les deux fichiers sur la sortie standard. En utilisant >, vous redirigez simplement la sortie standard vers un fichier. Cela fonctionnera aussi avec d'autres commandes.

12

Faites-le avec une simple boucle:

for i in *.txt; do cat "$i" >> complete.txt; done

>> est ajouté au fichier.

Remarque: Si, pour une raison quelconque, vous devez réexécuter la commande, vous devez supprimer complete.txt, sinon vous écrivez le fichier sur lui-même, ce qui ne fonctionne pas.

5
phoibos

Si les fichiers que vous souhaitez combiner se terminent tous par .txt, restez simple:

cat *.txt > combined.txt

Si le répertoire ne contient que des fichiers texte, c'est aussi simple:

cat * > combined.txt

(Notez qu'une fois que vous avez créé combined.txt, recommencez-le, vous l'incluez dans l'extension de *, ce qui entraîne un comportement étrange).

Si vous souhaitez sélectionner certains fichiers du répertoire et pas d'autres, il est préférable que les noms de fichiers vous permettent de distinguer ceux que vous voulez. Si ce n'est pas le cas, vous pouvez avoir envie de find. Mais je doute que vous deviez aller aussi loin.

4
alexis

Thunar script d'action personnalisé écrit par cipricus m'a aussi inspiré pour écrire un script Nautilus similaire et j'ai pensé qu'il pourrait être utile à ceux qui consultent ce Q & R de se référer à ce sujet. Alors la voici:

#!/bin/sh
#Nautilus Script to join selected text files in a single file and open the joined file with default text editor
#
IFS=$'\n'
FILENAME="JoinedFile_$(date +%Y-%m-%d-%H-%M-%S).txt"
cat "$@" > "$FILENAME"
xdg-open "$FILENAME"
4
Sadi

Ceci est un complément et une variante des autres réponses, liées à la mise en œuvre de ces solutions dans les actions de la coutume de Thunar.

Tous ne sont pas utilisables de cette façon, mais certains le sont.

Je pensais que le plus intéressant serait de pouvoir fusionner les fichiers sélectionnés dans le menu contextuel de Thunar .

Ceci est une variation de ce qui a été suggéré par Sadi dans un commentaire à gertvdijkréponse :

   cat %N > JoinedFile

Seuls les fichiers sélectionnés seront joints. Limitez les conditions d'apparence aux fichiers texte.

enter image description here

enter image description here


Un merci spécial à Sadi dont le commentaire m'a fourni la solution la plus claire et la plus actualisée à mon problème.

J'ai accepté gertvdijkréponse comme définitif. Non seulement c'était l'occasion de commenter Sadi, mais cela semble être un atout supplémentaire pour les autres, en fournissant une solution bien argumentée et complète (bien qu'un peu au-dessus de mes compétences en lecture de la CLI).

2
user47206

Vous pouvez aussi essayer la commande findname__,

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

Il trouve les fichiers .txt dans le répertoire en cours et exécute la commande catsur chaque fichier trouvé. Finalement, toute la sortie a été redirigée vers le nom de fichier filename __ (créé directement dans le courant même).

Explication:

.                  # current directory

-name              # helps to find only .txt files.

-type f            # Only files

-exec cat {} +     # helps to run cat command on the founded .txt files.

>                  # Output redirection operator

file               # to store final output.
2
Avinash Raj