Je souhaite copier le contenu de cinq fichiers dans un seul fichier tel quel. J'ai essayé de le faire en utilisant cp pour chaque fichier. Mais cela écrase le contenu copié à partir du fichier précédent. J'ai aussi essayé
paste -d "\n" 1.txt 0.txt
et cela n'a pas fonctionné.
Je veux que mon script ajoute la nouvelle ligne à la fin de chaque fichier texte.
par exemple. Fichiers 1.txt, 2.txt, 3.txt. Mettre le contenu de 1,2,3 dans 0.txt
Comment fait-on ça ?
Réponses:
Vous avez besoin de la commande
cat
(abréviation de concatenate), avec la redirection shell (>
) dans votre fichier de sortiela source
>>
pour ajouter un fichier à un autre, où>
écrase le fichier de sortie avec tout ce qui y est dirigé. Quant à la nouvelle ligne, y a-t-il une nouvelle ligne comme premier caractère dans le fichier1.txt
? Vous pouvez le découvrir en utilisantod -c
et voir si le premier caractère est un\n
.{...}
de correspondance de nom de fichier, alors peut-être que les citations ont un peu gâché les choses dans votre script? J'essaie toujours de travailler avec des choses comme celle-ci en utilisantls
dans un shell. Lorsque j'obtiens la bonne commande, je la coupe-n-collez simplement dans un script tel quel. Vous pouvez également trouver l'-x
option utile dans vos scripts - elle fera écho aux commandes développées dans le script avant l'exécution.Une autre option, pour ceux d'entre vous qui tombent encore sur ce post comme je l'ai fait, est d'utiliser
find -exec
:Dans mon cas, j'avais besoin d'une option plus robuste qui examinerait plusieurs sous-répertoires, j'ai donc choisi de l'utiliser
find
. Décomposer:Regardez dans le répertoire de travail actuel.
Intéressé uniquement par les fichiers, pas par les répertoires, etc.
Réduire le jeu de résultats par nom
Exécutez la commande cat pour chaque résultat. "+" signifie qu'une seule instance de
cat
est générée (merci @gniourf_gniourf)Comme expliqué dans d'autres réponses, ajoutez le contenu cat-ed à la fin d'un fichier de sortie.
la source
*.txt
doit être entre guillemets (sinon, lafind
commande entière , telle qu'elle est écrite, est inutile). Une autre faille vient d'une idée fausse: la commande qui est exécutée n'est pascat >> 0.txt {}
, maiscat {}
. Votre commande est en fait équivalente à{ find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt
(j'ai ajouté le regroupement pour que vous vous rendiez compte de ce qui se passe réellement). Un autre défaut est qu'ilfind
va trouver le fichier0.txt
etcat
se plaindra en disant que le fichier d'entrée est le fichier de sortie .>> output.file
à la fin de votre commande, afin de ne pas induire personne (y compris vous-même) à penser quefind
cela s'exécuteracat {} >> output.file
pour chaque fichier trouvé.-exec cat {} +
place de-exec cat {} \;
, de sorte qu'une seule instance decat
soit générée avec plusieurs arguments (+
est spécifié par POSIX ).find . -type f -exec cat {} + >> outputfile.txt
et je ne pouvais pas comprendre pourquoi mon fichier de sortie n'arrêterait pas de se développer dans les concerts même si le répertoire ne faisait que 50 Mo. C'était parce que je continuais à ajouter outputfile.txt à lui-même! Assurez-vous donc de nommer ce fichier correctement ou de le placer entièrement dans un autre répertoire pour éviter cela.si vous avez un certain type de sortie, faites quelque chose comme ça
la source
file_1
,,file_2
…file_11
, En raison de l'ordre naturel de tri des fichiers.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
la source
file_1
,,file_2
…file_11
, En raison de l'ordre naturel de tri des fichiers.J'ai trouvé cette page parce que j'avais besoin de joindre 952 fichiers en un seul. J'ai trouvé que cela fonctionnait beaucoup mieux si vous avez de nombreux fichiers. Cela fera une boucle pour le nombre de nombres dont vous avez besoin et chattera chacun en utilisant >> pour ajouter à la fin de 0.txt.
la source
Si tous vos fichiers sont nommés de la même manière, vous pouvez simplement faire:
la source
Une autre option est
sed
:Ou...
Ou...
Ou sans redirection ...
Notez que la dernière ligne écrit aussi
merge.txt
(paswmerge.txt
!). Vous pouvez utiliserw"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 des 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 entre accolades de cette manière:
la source
si vos fichiers contiennent des en- têtes et que vous souhaitez les supprimer dans le fichier de sortie, vous pouvez utiliser:
la source
Si le fichier d'origine contient des caractères non imprimables, ils seront perdus lors de l'utilisation de la commande cat. En utilisant 'cat -v', les non-imprimables seront convertis en chaînes de caractères visibles, mais le fichier de sortie ne contiendrait toujours pas les caractères non imprimables réels dans le fichier d'origine. Avec un petit nombre de fichiers, une alternative pourrait être d'ouvrir le premier fichier dans un éditeur (par exemple vim) qui gère les caractères non imprimables. Ensuite, déplacez-vous vers le bas du fichier et entrez ": r second_file_name". Cela attirera le deuxième fichier, y compris les caractères non imprimables. La même chose pourrait être faite pour les fichiers supplémentaires. Lorsque tous les fichiers ont été lus, entrez ": w". Le résultat final est que le premier fichier contiendra désormais ce qu'il faisait à l'origine, plus le contenu des fichiers qui ont été lus.
la source
Si vous souhaitez ajouter le contenu de 3 fichiers dans un seul fichier, la commande suivante sera un bon choix:
Il combinera le contenu de tous les fichiers dans file4, jetant la sortie de la console vers
/dev/null
.la source