Comment ajouter un fichier à un autre dans Ubuntu Linux?

j'ai deux fichiers: file1 et file2 . Comment puis-je ajouter le contenu de file2 à file1 de sorte que le contenu de file1 persiste dans le processus?

356
demandé sur The_Modeler 2011-02-11 16:39:20

9 réponses

Use bash builtin redirection (tldp) :

cat file2 >> file1
520
répondu David 2018-09-24 07:08:25

cat file2 >> file1

l'opérateur >> ajoute la sortie au fichier nommé ou crée le fichier nommé s'il n'existe pas.

cat file1 file2 > file3

cela concaténate deux ou plusieurs fichiers à un. Vous pouvez avoir autant de fichiers source que vous avez besoin. Par exemple,

cat *.txt >> newfile.txt

mise à jour 20130902

Dans le commentaires eumiro suggère "n'essayez pas cat file1 file2 > file1 ."La raison pour laquelle cela pourrait ne pas avoir pour résultat le résultat attendu est que le fichier recevant la redirection est préparé avant que la commande à gauche du > soit exécutée. Dans ce cas, d'abord file1 est tronqué à la longueur zéro et ouvert pour la sortie, puis la commande cat tente de concaténer le fichier maintenant de longueur zéro plus le contenu de file2 en file1 . Le résultat est que le contenu d'origine de file1 sont perdus et à sa place est une copie de file2 qui n'est probablement pas ce qui était prévu.

mise à Jour 20160919

Dans les commentaires, tpartee suggère d'établir un lien vers les informations/sources de soutien. Pour une référence faisant autorité, je dirige le lecteur aimable à la SH man page à linuxcommand.org qui stipule:

avant qu'une commande soit exécutée, son les entrées et les sorties peuvent être redirigées en utilisant une notation spéciale interprétée par le shell.

bien que cela dit au lecteur ce qu'ils ont besoin de savoir, il est facile de manquer si vous n'êtes pas à la recherche et l'analyse de la déclaration mot par mot. Le mot le plus important ici étant "d'avant". La redirection est terminée (ou échoue) avant la commande est exécutée.

dans le cas de cat file1 file2 > file1 , la coque effectue la redirection d'abord afin que l'I/O poignées sont en place dans l'environnement dans lequel la commande sera exécutée avant qu'il soit exécuté.

une version plus conviviale dans laquelle la priorité de redirection est couverte en détail peut être trouvée sur le site Web de Ian Allen sous la forme de Linux courseware. Sa page notes de Redirection a beaucoup à dire sur le sujet, y compris l'observation que la redirection fonctionne même sans commande. Passant ceci au shell:

$ >out

...crée un fichier vide nommé. Le shell met d'abord en place la redirection des e/s, puis cherche une commande, n'en trouve aucune, et termine l'opération.

266
répondu T.Rob 2018-05-08 17:16:22

Note : si vous devez utiliser sudo , faites ceci:

sudo bash -c 'cat file2 >> file1'

la méthode habituelle de simplement préparer sudo à la commande échouera, puisque l'escalade de privilèges ne se répercute pas dans la redirection de sortie.

38
répondu jdunk 2014-06-24 11:37:26

essayez cette commande:

cat file2 >> file1
26
répondu eumiro 2011-02-11 13:40:37

la commande que vous cherchez est

cat file2 >> file1
22
répondu jmatraszek 2011-02-11 13:41:00

juste pour référence, l'utilisation de ddrescue fournit un moyen interruptible d'atteindre la tâche si, par exemple, vous avez de grands fichiers et le besoin de s'arrêter et puis continuer à un point ultérieur:

ddrescue -o $(wc --bytes file1 | awk '{ print  }') file2 file1 logfile

le logfile est le passage important. Vous pouvez interrompre le processus avec Ctrl-C et le reprendre en spécifiant la même commande à nouveau et ddrescue Lira logfile et reprendra là où il s'est arrêté. Le drapeau -o A indique ddrescue pour démarrer à partir de l'octet Un dans le fichier de sortie ( file1 ). Donc wc --bytes file1 | awk '{ print }' n'extrait que la taille de file1 en octets (vous pouvez simplement coller dans la sortie de ls si vous voulez).

Comme l'a souligné ngks dans les commentaires, l'inconvénient est que ddrescue ne sera probablement pas installé par défaut, vous devrez l'installer manuellement. L'autre problème est qu'il existe deux versions de ddrescue qui pourrait être dans vos dépôts: voir cette question askubuntu pour plus d'informations. La version que vous voulez est le GNU ddrescue, et sur les systèmes basés sur Debian est le paquet nommé gddrescue :

sudo apt install gddrescue

pour les autres distros, consultez votre système de gestion de paquets pour la version GNU de ddrescue.

13
répondu Zorawar 2018-06-20 15:47:57

une autre solution:

cat file1 | tee -a file2

tee a l'avantage que vous pouvez ajouter autant de fichiers que vous le souhaitez, par exemple:

cat file1 | tee -a file2 file3 file3

ajoutera le contenu de file1 à file2 , file3 et file4 .

de la page de manuel:

-a, --append
       append to the given FILEs, do not overwrite
1
répondu Stefan van den Akker 2017-10-07 15:26:49

cat peut être la solution facile, mais qui deviennent très lents lorsque nous concatons de gros fichiers, find -print est de vous sauver, bien que vous devez utiliser cat une fois.

amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt

 amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt

real    0m3.084s
user    0m0.012s
sys     0m2.308s


amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1

real    0m2.516s
user    0m0.028s
sys     0m2.204s
0
répondu Amey Jadiye 2016-05-24 18:41:06

vous pouvez aussi le faire sans cat , bien que honnêtement cat soit plus lisible:

>> file1 < file2

Le >> ajoute STDIN à file1 et le < décharges "de 151960920" à STDIN .

0
répondu Alok Singh 2018-03-12 21:34:51