Antworten:
Verwenden Sie die integrierte Bash-Umleitung (tldp) :
cat file2 >> file1
sudo
den cat
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 die file1
Länge Null abgeschnitten und für die Ausgabe geöffnet. Anschließend cat
versucht der Befehl, die Datei mit der Länge Null und den Inhalt von file2
into zu verketten file1
. Das Ergebnis ist, dass der ursprüngliche Inhalt von file1
verloren geht und an seiner Stelle eine Kopie steht, von file2
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:
Bevor ein Befehl ausgeführt wird, können seine Eingabe und Ausgabe unter Verwendung einer von der Shell interpretierten speziellen Notation umgeleitet werden.
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:
$ >out
... 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.
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 dies cat 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 zuerst file1
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.
cat file2 | sudo tee -a file1 > /dev/null
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:
ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile
Das logfile
ist das Wichtige. Sie können den Vorgang mit unterbrechen Ctrl-C
und fortsetzen, indem Sie genau denselben Befehl erneut angeben. Ddrescue liest logfile
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 also wc --bytes file1 | awk '{ print $1 }'
einfach die Größe file1
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
:
sudo apt install gddrescue
Für andere Distributionen überprüfen Sie Ihr Paketverwaltungssystem auf die GNU- Version von ddrescue.
Eine andere Lösung:
cat file1 | tee -a file2
tee
hat den Vorteil, dass Sie an beliebig viele Dateien anhängen können, zum Beispiel:
cat file1 | tee -a file2 file3 file3
wird der Inhalt anhängen file1
zu file2
, file3
und file4
.
Von der Manpage:
-a, --append
append to the given FILEs, do not overwrite
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.
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
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 gesagt cat
besser lesbar ist:
>> file1 < file2
Das >>
hängt STDIN an file1
und die <
Dumps file2
an STDIN .