it-swarm.com.de

Wie hängt man eine Datei unter Linux von der Shell an eine andere an?

Ich habe zwei Dateien: file1 und file2. Wie füge ich den Inhalt von file2 an file1 an, sodass der Inhalt von file1 den Prozess beibehält?

399
asir

Verwenden Sie integrierte Bash-Umleitung (tldp) :

cat file2 >> file1
581
David

cat file2 >> file1

Der Operator >> hängt die Ausgabe an die angegebene Datei an oder erstellt die angegebene Datei, falls sie nicht vorhanden ist.

cat file1 file2 > file3

Dies verkettet zwei oder mehr Dateien zu einer. 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 "nicht 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 vom > ausgeführt wird. In diesem Fall wird zuerst file1 auf die Länge Null gekürzt und zur Ausgabe geöffnet. Anschließend versucht der Befehl cat, die Datei mit der Länge Null und den Inhalt von file2 in file1 zu verketten. Das Ergebnis ist, dass der ursprüngliche Inhalt von file1 verloren geht und stattdessen eine Kopie von file2 vorhanden ist, was wahrscheinlich nicht der erwartete Wert ist.

Update 20160919
In den Kommentaren schlägt tpartee vor, auf Hintergrundinformationen/-quellen zu verlinken. Als Referenz verweise ich den freundlichen Leser auf die Seite sh man page unter linuxcommand.org, in der es heißt:

Bevor ein Befehl ausgeführt wird, können seine Eingabe und Ausgabe unter Verwendung einer speziellen Notation umgeleitet werden, die von der Shell interpretiert wird.

Während dies dem Leser sagt, was er wissen muss, ist es leicht zu übersehen, wenn Sie nicht danach suchen und die Aussage Wort für Wort analysieren. Das wichtigste Wort ist hier das 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, damit 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 Vorrangstellung der Weiterleitung ausführlich behandelt wird, finden Sie auf der Website von Ian Allen in Form von Linux-Kursunterlagen. Seine Seite Anmerkungen zur E/A-Umleitung hat viel zu diesem Thema zu sagen, einschließlich der Feststellung, 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.

288
T.Rob

Hinweis: Wenn Sie Sudo verwenden müssen, gehen Sie folgendermaßen vor:

Sudo bash -c 'cat file2 >> file1'

Die übliche Methode, dem Befehl einfach Sudo voranzustellen, schlägt fehl, da die Rechteerweiterung nicht in die Ausgabeumleitung übernommen wird.

40
jdunk

Versuchen Sie diesen Befehl:

cat file2 >> file1
27
eumiro

der Befehl, den Sie suchen, ist

cat file2 >> file1
22
jmatraszek

Nur als Referenz bietet die Verwendung von ddrescue eine unterbrechbare Möglichkeit, die Aufgabe zu erledigen, wenn Sie zum Beispiel große Dateien haben und an einem späteren Punkt pausieren und weitermachen müssen:

ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile

Das logfile ist das wichtige Bit. Sie können den Vorgang mit Ctrl-C unterbrechen und ihn fortsetzen, indem Sie denselben Befehl erneut eingeben. Ddrescue liest dann logfile und setzt den Vorgang dort fort, wo er aufgehört hat. Das -o A -Flag weist ddrescue an, mit Byte A in der Ausgabedatei (file1) zu beginnen. Also extrahiert wc --bytes file1 | awk '{ print $1 }' nur die Größe von file1 in Bytes (Sie können einfach die Ausgabe von ls einfügen, 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 Repositorys befinden: Weitere Informationen finden Sie unter diese Frage . Die gewünschte Version ist GNU ddrescue, und auf Debian-basierten Systemen ist das Paket gddrescue:

Sudo apt install gddrescue

Für andere Distributionen überprüfen Sie Ihr Paketverwaltungssystem auf die GNU Version von ddrescue.

13
Zorawar

Eine andere Lösung:

cat file1 | tee -a file2

tee hat den Vorteil, dass Sie beliebig viele Dateien anhängen können, zum Beispiel:

cat file1 | tee -a file2 file3 file3

hängt den Inhalt von file1 an file2, file3 und file4 an.

Von der Manpage:

-a, --append
       append to the given FILEs, do not overwrite

Ich bin mir nicht sicher, aber viele Leute haben mir hier gesagt, dass die Verwendung des Befehls cat zum Anzeigen des Inhalts einer einzelnen Datei keine gute Vorgehensweise ist, und dass jemand den Link this mit mir geteilt hat.

Berücksichtigen Sie dies alles, der folgende Weg scheint besser.

echo -n "$(<file1)" >> file2
0
Mihir

Sie können dies auch ohne cat tun, obwohl ehrlich cat besser lesbar ist:

>> file1 < file2

Der >> hängt STDIN an file1 und der < gibt file2 an STDIN aus.

0
Alok Singh

cat kann die einfache Lösung sein, aber das wird sehr langsam, wenn wir große Dateien zusammenfassen. find -print soll Sie retten, obwohl Sie cat einmal verwenden müssen.

[email protected] ~/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

 [email protected] ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt

real    0m3.084s
user    0m0.012s
sys     0m2.308s


[email protected] ~/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
0
Amey Jadiye