Ich habe zwei Dateien: file1
und file2
. Wie füge ich den Inhalt von an file2
an, file1
damit der Inhalt von file1
den Prozess beibehält?
418
Verwenden Sie die integrierte Bash-Umleitung (tldp) :
cat file2 >> file1
sudo
dencat
Befehl vorab anhängen (und Anmeldeinformationen eingeben, wenn Sie dazu aufgefordert werden).tee
Programm an :cat 1 | tee -a 2 3
. Sie können nach dem--append
(oder-a
kurz) Wechsel beliebig viele Dateien ablegen.cat file2 >> file1
Der
>>
Operator hängt die Ausgabe an die benannte Datei an oder erstellt die benannte Datei, wenn sie nicht vorhanden ist.cat file1 file2 > file3
Dadurch werden zwei oder mehr Dateien zu einer verknüpft. Sie können so viele Quelldateien haben, wie Sie benötigen. Zum Beispiel,
cat *.txt >> newfile.txt
Update 20130902
In den Kommentaren schlägt eumiro vor, es nicht zu versuchen
cat file1 file2 > file1
. Der Grund, warum dies möglicherweise nicht zum erwarteten Ergebnis führt, ist, dass die Datei, die die Umleitung empfängt, vorbereitet wird, bevor der Befehl links von>
ausgeführt wird. In diesem Fall wird zuerst diefile1
Länge Null abgeschnitten und für die Ausgabe geöffnet. Anschließendcat
versucht der Befehl, die Datei mit der Länge Null und den Inhalt vonfile2
into zu verkettenfile1
. Das Ergebnis ist, dass der ursprüngliche Inhalt vonfile1
verloren geht und an seiner Stelle eine Kopie steht, vonfile2
der wahrscheinlich nicht das ist, was erwartet wurde.Update 20160919
In den Kommentaren schlägt tpartee vor, auf Hintergrundinformationen / Quellen zu verlinken. Als maßgebliche Referenz verweise ich den freundlichen Leser auf die sh-Manpage unter linuxcommand.org, auf der es heißt:
Das sagt dem Leser zwar, was er wissen muss, aber es ist leicht zu übersehen, wenn Sie nicht danach suchen und die Aussage Wort für Wort analysieren. Das wichtigste Wort hier ist "vorher". Die Umleitung ist abgeschlossen (oder schlägt fehl), bevor der Befehl ausgeführt wird.
Im Beispielfall
cat file1 file2 > file1
führt die Shell zuerst die Umleitung durch, sodass die E / A-Handles in der Umgebung vorhanden sind, in der der Befehl ausgeführt wird, bevor er ausgeführt wird.Eine freundlichere Version, in der die Priorität der Umleitung ausführlich behandelt wird, finden Sie auf der Website von Ian Allen in Form von Linux-Kursunterlagen. Seine Seite mit E / A-Umleitungsnotizen hat viel zu diesem Thema zu sagen, einschließlich der Beobachtung, dass die Umleitung auch ohne Befehl funktioniert. Weitergabe an die Shell:
... erstellt eine leere Datei mit dem Namen out. Die Shell richtet zuerst die E / A-Umleitung ein, sucht dann nach einem Befehl, findet keinen und schließt den Vorgang ab.
quelle
cat file1 file2 > file1
Sie es nicht - das wird nicht so funktionieren, wie Sie es wahrscheinlich erwarten.>>
dem die Datei geändert wirdfile1
. T.Rob hat seine Antwort weit überlegen erklärt, anstatt nur zu rennen, um etwas einzureichen, das tatsächlich falsch war. Basierend auf dem Text der Frage glaube ich, dass diescat file1 file2 > file3
der geeignete Befehl ist, nach dem @asir gesucht hat.>
zuerst ausgeführt wird.cat file1 file2 > file1
Wenn Sie also ausführen , wird zuerstfile1
versucht, die Datei mit der Länge Null auf sich selbst zu kopieren. Dies ist sinnvoll, wenn Sie über die Reihenfolge nachdenken, in der die Operationen stattfinden könnten und sollten, ist jedoch so subtil, dass viele Menschen überrascht werden. Wenn nichts anderes, haben eumiro und Sie eine weitere Verbesserung der Antwort veranlasst. Dank dafür!>>
sie an die Datei angehängt und>
ersetzt die Datei , um sie etwas präziser zu gestalten .Hinweis : Wenn Sie sudo verwenden müssen , gehen Sie folgendermaßen vor:
sudo bash -c 'cat file2 >> file1'
Die übliche Methode zum einfachen Voranstellen
sudo
des Befehls schlägt fehl, da die Eskalation von Berechtigungen nicht auf die Ausgabeumleitung übertragen wird.quelle
cat file2 | sudo tee -a file1 > /dev/null
Versuchen Sie diesen Befehl:
quelle
Nur als Referenz bietet die Verwendung von ddrescue eine unterbrechbare Möglichkeit, die Aufgabe zu erfüllen, wenn Sie beispielsweise große Dateien haben und eine Pause einlegen und zu einem späteren Zeitpunkt fortfahren müssen:
Das
logfile
ist das Wichtige. Sie können den Vorgang mit unterbrechenCtrl-C
und fortsetzen, indem Sie genau denselben Befehl erneut angeben. Ddrescue liestlogfile
und setzt ihn dort fort, wo er aufgehört hat. Das-o A
Flag weist ddrescue an, mit Byte A in der Ausgabedatei (file1
) zu beginnen. Extrahiert alsowc --bytes file1 | awk '{ print $1 }'
einfach die Größefile1
in Bytes (Sie können die Ausgabe einfach einfügen,ls
wenn Sie möchten).Wie von ngks in den Kommentaren hervorgehoben, besteht der Nachteil darin, dass ddrescue wahrscheinlich nicht standardmäßig installiert wird, sodass Sie es manuell installieren müssen. Die andere Komplikation ist, dass es zwei Versionen von ddrescue gibt, die sich möglicherweise in Ihren Repositories befinden: Weitere Informationen finden Sie in dieser Askubuntu-Frage . Die gewünschte Version ist GNU ddrescue, und auf Debian-basierten Systemen lautet das Paket mit dem Namen
gddrescue
:Für andere Distributionen überprüfen Sie Ihr Paketverwaltungssystem auf die GNU- Version von ddrescue.
quelle
Eine andere Lösung:
tee
hat den Vorteil, dass Sie an beliebig viele Dateien anhängen können, zum Beispiel:wird der Inhalt anhängen
file1
zufile2
,file3
undfile4
.Von der Manpage:
quelle
cat
kann die einfache Lösung sein, aber das wird sehr langsam, wenn wir große Dateien zusammenfassen,find -print
ist es, Sie zu retten, obwohl Sie cat einmal verwenden müssen.quelle
time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)
folgt zu steuern : und er sollte ähnliche Ergebnisse wie der Befehl nur für Katzen liefern.Sie können dies auch ohne tun
cat
, obwohl dies ehrlich gesagtcat
besser lesbar ist:>> file1 < file2
Das
>>
hängt STDIN anfile1
und die<
Dumpsfile2
an STDIN .quelle