web-dev-qa-db-fra.com

Comment ajouter un fichier à un autre sous Linux à partir du shell?

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

389
asir

Utilisez bash builtin redirection (tldp) :

cat file2 >> file1
570
David

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ène deux ou plusieurs fichiers en un. Vous pouvez avoir autant de fichiers source que nécessaire. Par exemple,

cat *.txt >> newfile.txt

Mise à jour 20130902
Dans les commentaires, eumiro suggère "n'essayez pas cat file1 file2 > file1." La raison pour laquelle cela pourrait ne pas aboutir au résultat attendu est que le fichier recevant la redirection est préparé avant l'exécution de la commande située à gauche du >. Dans ce cas, file1 est d’abord tronqué à une longueur nulle et ouvert pour la sortie, puis la commande cat tente de concaténer le fichier de longueur zéro ainsi que le contenu de file2 en file1. Le résultat est que le contenu original de file1 est perdu et qu’il est remplacé par une copie de file2 qui n’est probablement pas conforme à ce qui était attendu.

Mise à jour 20160919
Dans les commentaires, tpartee suggère de créer un lien vers des informations/sources de sauvegarde. Pour une référence faisant autorité, je renvoie le lecteur à la page de manuel de sh à l'adresse linuxcommand.org qui indique:

Avant qu'une commande ne soit exécutée, son entrée et sa sortie peuvent être redirigées à l'aide d'une notation spéciale interprétée par le shell.

Bien que cela indique au lecteur ce qu'il doit savoir, il est facile de le manquer si vous ne le recherchez pas et n'analysez pas la déclaration Word par Word. Le mot le plus important ici étant 'avant'. La redirection est terminée (ou échoue) avant que la commande soit exécutée.

Dans l'exemple de cas cat file1 file2 > file1, le shell effectue d'abord la redirection de sorte que les descripteurs d'E/S soient en place dans l'environnement dans lequel la commande sera exécutée avant son exécution.

Une version plus conviviale dans laquelle la priorité de la redirection est longuement couverte peut être consultée sur le site Web de Ian Allen sous la forme d'un didacticiel Linux. Sa page Notes de redirection d'E/S a beaucoup à dire sur le sujet, y compris l'observation que la redirection fonctionne même sans commande. Passant ceci à la coquille:

$ >out

... crée un fichier vide nommé. Le shell configure d’abord la redirection E/S, puis recherche une commande, n’en trouve aucune et achève l’opération.

285
T.Rob

Note: si vous avez besoin d'utiliser Sudo, procédez comme suit:

Sudo bash -c 'cat file2 >> file1'

La méthode habituelle consistant simplement à ajouter Sudoà la commande échouera, car la progression des privilèges ne sera pas reportée dans la redirection de sortie.

39
jdunk

Essayez cette commande:

cat file2 >> file1
27
eumiro

la commande que vous recherchez est

cat file2 >> file1
22
jmatraszek

À titre de référence, l’utilisation de ddrescue fournit un moyen interruptible d’accomplir la tâche si, par exemple, vous avez des fichiers volumineux et qu’il est nécessaire de mettre en pause, puis de continuer plus tard:

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

logfileest le bit important. Vous pouvez interrompre le processus avec Ctrl-C et le reprendre en spécifiant à nouveau exactement la même commande. Ddrescue lira logfileet reprendra là où elle s’était arrêtée. L’indicateur -o A indique à ddrescue de démarrer à partir d’octets A dans le fichier de sortie (file1). Donc, wc --bytes file1 | awk '{ print $1 }' extrait simplement la taille de file1 en octets (vous pouvez simplement coller le résultat de lssi vous le souhaitez).

Comme indiqué par ngks dans les commentaires, l'inconvénient est que ddrescue ne sera probablement pas installé par défaut. Vous devrez donc l'installer manuellement. L'autre complication est qu'il existe deux versions de ddrescue dans vos référentiels: voir cette question askubunt pour plus d'informations. La version souhaitée est le GNU ddrescue. Sur les systèmes Debian, le paquet est nommé gddrescuename__:

Sudo apt install gddrescue

Pour les autres distributions, vérifiez votre système de gestion de paquets pour la version GNU de ddrescue.

13
Zorawar

Une autre solution:

cat file1 | tee -a file2

tee présente l'avantage de pouvoir 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

Je ne suis pas sûr de cela, mais beaucoup de gens m'ont dit ici qu'utiliser la commande cat pour afficher le contenu d'un seul fichier n'était pas une bonne pratique et que quelqu'un partageait un lien ceci avec moi.

Considérez tout cela, la manière suivante semble meilleure.

echo -n "$(<file1)" >> file2
0
Mihir

Vous pouvez également le faire sans cat, mais honnêtement cat est plus lisible:

>> file1 < file2

Le >> ajoute STDIN à file1 et le < vide file2 dans STDIN.

0
Alok Singh

cat peut être la solution facile, mais cela devient très lent lorsque nous concaténons des fichiers volumineux. find -print est destiné à vous sauver, bien que vous deviez 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
Amey Jadiye