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?
Utilisez bash builtin redirection (tldp) :
cat file2 >> file1
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.
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.
Essayez cette commande:
cat file2 >> file1
la commande que vous recherchez est
cat file2 >> file1
À 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
logfile
est 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 logfile
et 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 ls
si 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é gddrescue
name__:
Sudo apt install gddrescue
Pour les autres distributions, vérifiez votre système de gestion de paquets pour la version GNU de ddrescue.
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
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
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.
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