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
.
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
.
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.
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.
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:
*.txt
avec le fichier de sortie output.out
ne sera pas en collision.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.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.
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.
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.
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"
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.
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).
Vous pouvez aussi essayer la commande find
name__,
find . -name "*.txt" -type f -exec cat {} + > file
Il trouve les fichiers .txt
dans le répertoire en cours et exécute la commande cat
sur chaque fichier trouvé. Finalement, toute la sortie a été redirigée vers le nom de fichier file
name __ (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.