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?
Antworten
Zu viele Anzeigen?Utilice bash-interne Umleitung (tldp) :
cat file2 >> file1
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.
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.
- See previous answers
- Weitere Antworten anzeigen