J'ai deux fichiers: file1
et file2
. Comment ajouter le contenu de file2
àfile1
pour que le contenu de file1
persiste dans le processus?
418
Utilisez la redirection intégrée bash (tldp) :
cat file2 >> file1
sudo
lacat
commande (et entrez les informations d'identification si vous y êtes invité).tee
programme:cat 1 | tee -a 2 3
. Vous pouvez mettre autant de fichiers que vous le souhaitez après le commutateur--append
(ou-a
pour faire court).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 fichiers ou plus en un seul. 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 peut ne pas aboutir au résultat attendu est que le fichier recevant la redirection est préparé avant l'>
exécution de la commande à gauche de la . Dans ce cas, la premièrefile1
est tronquée à zéro et ouverte pour la sortie, puis lacat
commande tente de concaténer le fichier désormais de longueur zéro plus le contenu defile2
dansfile1
. Le résultat est que le contenu original defile1
est perdu et à sa place se trouve une copiefile2
dont ce n'est probablement pas ce qui était attendu.Mise à jour 20160919
Dans les commentaires, le tpartee suggère un lien vers des informations / sources de support. Pour une référence faisant autorité, je dirige le lecteur aimable vers la page de manuel sh à linuxcommand.org qui déclare:
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'analyse pas la déclaration mot par mot. Le mot le plus important ici est «avant». La redirection est terminée (ou échoue) avant l'exécution de la commande.
Dans le cas de l'exemple du
cat file1 file2 > file1
shell, la redirection est effectuée en premier afin que les poignées 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 redirection est longuement couverte peut être trouvée sur le site Web d'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. En passant ceci au shell:
... crée un fichier vide nommé. Le shell configure d'abord la redirection d'E / S, puis recherche une commande, n'en trouve aucune et termine l'opération.
la source
cat file1 file2 > file1
- cela ne fonctionnera pas comme vous l'attendez probablement.>>
qui va modifier le fichierfile1
. T.Rob a fait un travail bien supérieur pour expliquer sa réponse plutôt que de simplement courir pour soumettre quelque chose qui était, en fait, incorrect. Sur la base du texte de la question, je pense quecat file1 file2 > file3
c'est la commande appropriée que @asir recherchait.>
est exécutée en premier. Ainsi, l'exécution tenterait d'cat file1 file2 > file1
abord de clobberfile1
puis de copier le fichier maintenant de longueur nulle sur lui-même. Cela a du sens lorsque vous pensez à l'ordre dans lequel les opérations pourraient et devraient se produire, mais il est suffisamment subtil pour surprendre de nombreuses personnes. Donc, si rien d'autre, eumiro et vous avez incité à une nouvelle amélioration de la réponse. Merci pour ça!>>
s'ajoute au fichier et>
remplace le fichier.Remarque : si vous devez utiliser sudo , procédez comme suit :
sudo bash -c 'cat file2 >> file1'
La méthode habituelle de simplement ajouter
sudo
à la commande échouera, car l'escalade de privilèges ne se répercute pas sur la redirection de sortie.la source
cat file2 | sudo tee -a file1 > /dev/null
Essayez cette commande:
la source
À titre de référence, l'utilisation de ddrescue fournit un moyen interruptible de réaliser la tâche si, par exemple, vous avez des fichiers volumineux et si vous avez besoin de faire une pause, puis de poursuivre ultérieurement:
C'est
logfile
le bit important. Vous pouvez interrompre le processus avecCtrl-C
et le reprendre en spécifiant à nouveau la même commande exacte et ddrescue liralogfile
et reprendra là où il s'était arrêté. L'-o A
indicateur indique à ddrescue de démarrer à partir de l'octet A dans le fichier de sortie (file1
). Ilwc --bytes file1 | awk '{ print $1 }'
suffit donc d' extraire la taille defile1
en octets (vous pouvez simplement coller la sortie dels
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 qui pourraient se trouver dans vos référentiels: consultez 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
:Pour d'autres distributions, vérifiez votre système de gestion de paquets pour la version GNU de ddrescue.
la source
Une autre solution:
tee
a l'avantage que vous pouvez ajouter autant de fichiers que vous le souhaitez, par exemple:ajoutera le contenu de
file1
àfile2
,file3
etfile4
.Depuis la page de manuel:
la source
cat
peut être la solution facile, mais qui devient très lente lorsque nous concatérons de gros fichiers,find -print
est de vous sauver, bien que vous deviez utiliser cat une fois.la source
time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)
cela devrait produire des résultats similaires à votre commande cat only.Vous pouvez également le faire sans
cat
, mais honnêtement,cat
c'est plus lisible:>> file1 < file2
Le
>>
ajoute STDIN àfile1
et les<
déchargesfile2
à STDIN .la source