Comment joindre des fichiers texte?

21

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

Je veux une solution qui n'implique pas de taper les noms des fichiers à fusionner, mais qui fusionnerait simplement tous les fichiers txt dans le dossier.

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


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


la source

Réponses:

43

À utiliser catavec 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

Dans le cas où vous avez "beaucoup de documents", utilisez le globbing shell (modèles):

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

Cela joindra tous les fichiers de ce répertoire au répertoire actuel (l'empêchant ainsi de correspondre au fichier de sortie lui-même). Il est totalement indépendant de l'utilisation catet de la redirection de sortie - c'est juste Bash qui fournit tous les fichiers comme arguments cat.


Types de fichier

Il collera (joindra) les fichiers comme vous le feriez avec du papier et du ruban adhésif. Il ne se soucie pas que le format de fichier réel soit capable de gérer cela. Il fonctionnera pour les fichiers texte, mais pas pour les PDF, ODT, etc. Eh bien, il les collera ensemble, mais ce n'est plus un PDF / ODT valide.


Ordre d'adhésion

Comme l'a souligné Phoibos, le globbing du shell entraînera un ordre alphabétique des noms de fichiers. Voici comment fonctionne le globbing Bash et shell.


Addendum sur l' input file is output fileerreur

Lorsque le modèle des fichiers d'entrée correspond au même fichier qu'en sortie, cela provoquera une erreur. C'est une caractéristique de sécurité. Exemple: cat *.txt > out.txtexécuter la deuxième fois provoquera cela.

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 motif des fichiers d'entrée *.txtavec le fichier de sortie output.outne se heurtera pas.
  • Travaillez dans différents répertoires. Dans l'exemple ci-dessus, j'ai utilisé un input-files-dirrépertoire séparé pour placer tous les fichiers et les exporter vers le répertoire de travail actuel. Cela rend impossible d'obtenir cette erreur.
gertvdijk
la source
@cipricus Oui, mais c'est un globbing shell très basique (patterns). Essayez vos modèles en utilisant lssimplement la liste des correspondances. Par exemple ls *.txtpour voir ce qui est apparié.
gertvdijk
2
@cipricus Que diriez-vous de cat * .txt> JoinedFile.txt?
Sadi
1
C'est plus sensé en fait, cat attrape d'abord tous les fichiers .txt et deuxièmement il les joint et troisièmement il crée un nouveau fichier .txt qui ne peut pas être attrapé à la première étape ;-)
Sadi
1
@cipricus Il joint juste des fichiers. Comme vous le feriez en utilisant des morceaux de papier avec de la colle et du ruban adhésif! La plupart des formats de fichiers "documents" comme PDF, qui sont compressés ne le permettent pas. Utilisez un éditeur PDF. Mais de toute façon, votre question concernait les fichiers texte .
gertvdijk
1
Je comprends parfaitement que la méthode que vous proposez (créer un sous-répertoire, déplacer des fichiers puis rejoindre) pourrait être une meilleure façon dans certains cas. Mais si nous voulons simplement joindre tous les fichiers texte (tous ayant l'extension .txt) dans le répertoire courant cat * .txt> JoinedFile.txt fait parfaitement l'affaire. Je viens de le tester par curiosité et cela fonctionne, et il semble que cipricus ait également trouvé le même résultat. (Et le système a commencé à se plaindre que nous ne devrions pas discuter ici, sinon je demanderais si vous pouvez enseigner à ce novice comment utiliser la mise en forme dans ces commentaires sans barre d'outils ;-)
Sadi
12

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

cat file1 file2 > joined_file

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

Jorge Suárez de Lis
la source
Veuillez lire la question. Vous dites de spécifier des noms de fichiers individuels, ce que l'OP en particulier ne voulait pas faire!
Sri
2
Ce n'était pas dans la question initiale. Je n'ai pas mis à jour ma réponse car des réponses plus complètes sont apparues.
Jorge Suárez de Lis
@ JorgeSuárezdeLis Bien que cette réponse n'aide pas directement OP avec sa question, veuillez noter que cette réponse aidera probablement quelqu'un d'autre qui n'a que quelques fichiers à fusionner. (oh hé, comme moi! merci! ^ - ^) +1
Souta
@ JorgeSuárezdeLis En effet. Vous avez parfaitement répondu à la révision 2 de la question. Quelques minutes plus tard, la révision 3 a modifié les exigences relatives aux réponses.
gertvdijk
5

Faites-le avec une simple boucle:

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

>> ajoute au fichier.

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

phoibos
la source
5
Cela fonctionnera également, mais je ne vois pas la nécessité d'une boucle for si vous pouvez utiliser des arguments pour cat.
gertvdijk
1
Oui, vous avez bien sûr raison. Je ne suis tout simplement pas sûr de l'ordre des sord cat *.txt. La boucle for doit être triée.
phoibos
1
Il s'avère que * est garanti dans l'ordre alphabétique .
phoibos
Oui, c'est exactement le même globbing de coquille. Peu importe que vous l'utilisiez dans forou ailleurs dans Bash.
gertvdijk
4

Si les fichiers que vous souhaitez combiner finissent tous .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, le faire à nouveau l'inclurait dans l'expansion de *, conduisant à un comportement étrange).

Si vous souhaitez sélectionner certains fichiers dans le répertoire et pas d'autres, il est préférable que les noms de fichiers vous permettent de distinguer ceux que vous souhaitez. Sinon, vous pouvez devenir chic avec find. Mais je doute que vous deviez aller aussi loin.

alexis
la source
thnx. si vous regardez les commentaires de la réponse acceptée, Sadi l'a suggéré exactement dans un commentaire. si votre réponse avait été la première, la vôtre aurait été ce dont j'avais besoin. jetez un oeil au mien aussi: ajouté que dans le menu personnalisé
Merci pour les commentaires. Ouais, je le vois maintenant, c'était un peu obscurci ...
alexis
4

Le script d'action personnalisé Thunar écrit par cipricus m'a également inspiré pour écrire un script Nautilus similaire et j'ai pensé qu'il pourrait être utile pour d'autres qui regardent ce Q&R pour référence sur ce sujet. Voici donc:

#!/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"
Sadi
la source
@David Foerster Merci pour la modification. Je n'ai eu aucun problème avec l'ancienne version (avec mes cas de test limités) et je ne vois aucun problème avec cette version améliorée non plus. Désolé si j'ai causé des désagréments en raison d'un défaut dans la version précédente.
Sadi
Il n'était pas défectueux, mais il contenait une boucle inutile, ce qui rendait le code plus difficile à comprendre, à mon humble avis.
David Foerster
2

Il s'agit d'un complément et d'une variation par rapport aux autres réponses, liés à la mise en œuvre de ces solutions dans les actions personnalisées de Thunar.

Tous ne sont pas utilisables de cette manière, mais certains le sont.

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

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

   cat %N > JoinedFile

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

entrez la description de l'image ici

entrez la description de l'image ici


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

J'ai accepté la réponse de gertvdijk comme définitive. Non seulement c'était l'occasion du commentaire de Sadi, mais cela semble être plus utile aux autres, fournissant une solution bien argumentée et complète (bien que légèrement supérieure à mes compétences en lecture CLI).

Communauté
la source
2

Vous pouvez findégalement essayer la commande,

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

Il trouve des .txtfichiers dans le répertoire courant et exécute la catcommande sur chaque fichier fondé. Enfin, la sortie entière a été redirigée vers le nom de fichier file(créé directement dans le courant lui-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.
Avinash Raj
la source
-2

Vous pouvez également simplement utiliser un utilitaire en ligne tel que merge-files-online.com

StackMan
la source