500 Stimmen

Wie fügt man unter Linux eine Datei an eine andere an, und zwar über die Shell?

Ich habe zwei Dateien: file1 y file2 . Wie füge ich den Inhalt von file2 a file1 so dass die Inhalte von file1 auf dem Prozess bestehen?

713voto

David Punkte 189311

Utilice bash-interne Umleitung (tldp) :

cat file2 >> file1

321voto

T.Rob Punkte 31064

cat file2 >> file1

El >> Operator hängt die Ausgabe an die benannte Datei an oder erstellt die benannte Datei, wenn sie nicht existiert.

cat file1 file2 > file3

Damit werden zwei oder mehr Dateien zu einer Datei zusammengefügt. Sie können so viele Quelldateien haben, wie Sie benötigen. Zum Beispiel,

cat *.txt >> newfile.txt

Aktualisierung 20130902
In den Kommentaren schlägt eumiro vor: "Versuchen Sie es nicht cat file1 file2 > file1 ." Der Grund dafür, dass dies nicht zum erwarteten Ergebnis führt, ist, dass die Datei, die die Umleitung erhält, vor dem Befehl links von der > ausgeführt wird. In diesem Fall wird zunächst file1 auf die Länge Null abgeschnitten und für die Ausgabe geöffnet wird, dann wird die cat versucht, die jetzt null lange Datei plus den Inhalt von file2 en file1 . Das Ergebnis ist, dass der ursprüngliche Inhalt von file1 sind verloren gegangen, und an ihre Stelle ist eine Kopie von file2 was wahrscheinlich nicht das ist, was erwartet wurde.

Update 20160919
In den Kommentaren schlägt tpartee vor, auf weiterführende Informationen/Quellen zu verweisen. Für eine verbindliche Referenz verweise ich den geneigten Leser auf die sh man-Seite auf linuxcommand.org, die besagt:

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

Das sagt dem Leser zwar, was er wissen muss, ist aber leicht zu übersehen, wenn man nicht darauf achtet und die Aussage Wort für Wort analysiert. Das wichtigste Wort ist hier "bevor". Die Weiterleitung ist abgeschlossen (oder scheitert) vor wird der Befehl ausgeführt.

Im Beispielfall von cat file1 file2 > file1 die Shell führt die Umleitung zuerst durch, damit die E/A-Handles in der Umgebung, in der der Befehl ausgeführt wird, vorhanden sind, bevor er ausgeführt wird.

Eine freundlichere Version, in der der Vorrang der Umleitung ausführlich behandelt wird, finden Sie auf der Website von Ian Allen in Form von Linux-Kursunterlagen. Seine Hinweise zur E/A-Umleitung Seite hat viel zu diesem Thema zu sagen, einschließlich der Beobachtung, dass die Umleitung auch ohne einen Befehl funktioniert. Dies an die Shell weitergeben:

$ >out

...erzeugt eine leere Datei namens out. Die Shell richtet zunächst die E/A-Umleitung ein, sucht dann nach einem Befehl, findet keinen und schließt den Vorgang ab.

51voto

jdunk Punkte 2648

Hinweis : Wenn Sie Folgendes verwenden müssen sudo tun Sie dies:

sudo bash -c 'cat file2 >> file1'

Die übliche Methode des einfachen Voranstellens von sudo zum Befehl wird fehlschlagen, da die Privilegienerweiterung nicht in die Ausgabeumleitung übernommen wird.

28voto

eumiro Punkte 193562

Versuchen Sie diesen Befehl:

cat file2 >> file1

14voto

Zorawar Punkte 5997

Die Verwendung von ddrescue bietet eine unterbrechbare Möglichkeit, die Aufgabe zu erledigen, wenn Sie z. B. große Dateien haben und eine Pause einlegen und zu einem späteren Zeitpunkt fortfahren möchten:

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

El logfile ist der wichtige Teil. Sie können den Prozess unterbrechen mit Ctrl-C und nehmen Sie es wieder auf, indem Sie den gleichen Befehl noch einmal eingeben und ddrescue wird lesen logfile und machen dort weiter, wo sie aufgehört haben. Die -o A sagt ddrescue, dass es mit einem Byte beginnen soll A in der Ausgabedatei ( file1 ). Also wc --bytes file1 | awk '{ print $1 }' extrahiert einfach die Größe von file1 in Bytes (Sie können einfach die Ausgabe von ls wenn Sie möchten).

Wie von ngks in den Kommentaren, der Nachteil ist, dass ddrescue wahrscheinlich nicht standardmäßig installiert ist, so dass Sie es manuell installieren müssen. Die andere Komplikation ist, dass es zwei Versionen von ddrescue gibt, die in Ihren Repositories sein könnten: siehe diese askubuntu-Frage für weitere Informationen. Die Version, die Sie brauchen, ist GNU ddrescue, und auf Debian-basierten Systemen ist das Paket namens gddrescue :

sudo apt install gddrescue

Bei anderen Distributionen suchen Sie in Ihrem Paketverwaltungssystem nach dem GNU Version von ddrescue.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X