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?
9 réponses
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.
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.
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.
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
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
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 .