Wenn ich eine große Datei habe und sie in 100-Megabyte-Blöcke aufteilen muss, mache ich das
split -b 100m myImage.iso
Das gibt mir normalerweise sowas
xaa
xab
xac
xad
Und um sie wieder zusammenzubringen, habe ich benutzt
cat x* > myImage.iso
Es scheint, als gäbe es eine effizientere Möglichkeit, als jede Codezeile in einer Gruppe von Dateien zu lesen cat
und die Ausgabe in eine neue Datei umzuleiten. So öffnen Sie einfach zwei Dateien, entfernen die EOF
Markierung von der ersten und verbinden sie - ohne den gesamten Inhalt durchgehen zu müssen.
Windows / DOS verfügt über einen Kopierbefehl für Binärdateien. In der Hilfe wird erwähnt, dass dieser Befehl so konzipiert wurde, dass mehrere Dateien kombiniert werden können. Es funktioniert mit dieser Syntax: ( /b
ist für den Binärmodus)
copy /b file1 + file2 + file3 outputfile
Gibt es eine ähnliche oder bessere Möglichkeit, große Dateien unter Linux zusammenzuführen als cat?
Aktualisieren
Es scheint, dass dies cat
tatsächlich der richtige und beste Weg ist, Dateien zusammenzufügen. Ich bin froh zu wissen, dass ich die ganze Zeit den richtigen Befehl verwendet habe :) Vielen Dank an alle für Ihr Feedback.
cat x*
, da die Reihenfolge der Dateien von Ihren Ländereinstellungen abhängt. Beginnen Sie besser mit der Eingabecat x
, als Esc und dann zu drücken*
- Sie sehen die erweiterte Reihenfolge der Dateien und können sie neu anordnen.cat x*
Sie die Erweiterungcat xa{a..g}
der Shell-Klammer in Betracht ziehen, wodurch die angegebene Sequenz aufcat
xaa xab xac xad xae xaf xagcat x*
? Würde sich die neue Ländereinstellung nicht auch darauf auswirkensplit
, dass sie immer funktionieren würden , wennsplit
undcat x*
auf demselben System verwendet würden?split.c
in GNU Coreutils werden die Suffixe aus einer festen Anordnung von Zeichen aufgebaut:static char const *suffix_alphabet = "abcdefghijklmnopqrstuvwxyz";
. Das Suffix würde vom Gebietsschema nicht beeinflusst. (Aber ich glaube nicht, dass ein vernünftiges Gebietsschema die Kleinbuchstaben neu anordnen würde; selbst EBCDIC behält ihre Standardreihenfolge bei.)Antworten:
Dafür
cat
wurde es gemacht. Da es eines der ältesten GNU-Tools ist, halte ich es für sehr unwahrscheinlich, dass ein anderes Tool dies schneller / besser macht. Und es ist nicht kochend - es ist nur dann ausgegeben , umgeleitet werden .quelle
cat x, then press Esc
Trick, den Sie erwähnt haben, ist ordentlich. Ich habe nach so etwas gesucht, danke. Guter Kommentar und gute AntwortCtrl+W
auch ein Wort ausschneiden und dannCtrl+Y
einfügen.Unter der Haube
Es gibt keinen effizienteren Weg, als die erste Datei zu kopieren und danach die zweite Datei zu kopieren und so weiter. DOS
copy
undcat
tun das.Jede Datei wird unabhängig von anderen Dateien auf der Festplatte gespeichert. Nahezu jedes Dateisystem, das zum Speichern von Daten auf einem plattenähnlichen Gerät entwickelt wurde, arbeitet blockweise. Hier ist eine stark vereinfachte Darstellung dessen, was passiert: Die Festplatte ist in Blöcke von beispielsweise 1 KB unterteilt, und für jede Datei speichert das Betriebssystem die Liste der Blöcke, aus denen sie besteht. Die meisten Dateien sind nicht ganzzahlig lang, sodass der letzte Block nur teilweise belegt ist. In der Praxis weisen Dateisysteme viele Optimierungen auf, z. B. das Teilen des letzten Teilblocks zwischen mehreren Dateien oder das Speichern von "Blöcken 46798 bis 47913" anstelle von "Block 46798, Block 46799, ...". Wenn das Betriebssystem eine neue Datei erstellen muss, sucht es nach freien Blöcken. Die Blöcke müssen nicht aufeinander folgen: Wenn nur die Blöcke 4, 5, 98 und 178 frei sind, können Sie trotzdem eine 4-KB-Datei speichern.
Sie könnten Teilblöcke in der Mitte einer Datei unterstützen, dies würde jedoch zu einer erheblichen Komplexität führen, insbesondere wenn Sie nicht sequentiell auf Dateien zugreifen: Um zum 10340. Byte zu springen, könnten Sie nicht mehr zum 100. Byte des 11. Blocks springen um die Länge jedes dazwischenliegenden Blocks zu überprüfen.
Bei Verwendung von Blöcken können Sie nicht einfach zwei Dateien verbinden, da die erste Datei im Allgemeinen in der Mitte des Blocks endet. Sicher, Sie könnten einen Sonderfall haben, aber nur, wenn Sie beide Dateien bei der Verkettung löschen möchten. Das wäre eine sehr spezifische Behandlung für eine seltene Operation. Eine solche spezielle Behandlung funktioniert nicht von alleine, da auf einem typischen Dateisystem auf viele Dateien gleichzeitig zugegriffen wird. Wenn Sie also eine Optimierung hinzufügen möchten, müssen Sie sorgfältig überlegen: Was passiert, wenn ein anderer Prozess eine der beteiligten Dateien liest? Was passiert, wenn jemand versucht, A und B zu verketten, während jemand A und C verkettet? Und so weiter. Alles in allem wäre diese seltene Optimierung eine enorme Belastung.
Alles in allem können Sie das Zusammenfügen von Dateien nicht effizienter gestalten, ohne an anderer Stelle größere Opfer zu bringen. Es lohnt sich nicht.
Aufteilen und Verbinden
split
undcat
sind einfache Möglichkeiten zum Teilen und Verbinden von Dateien.split
kümmert sich um das Erstellen von Dateien mit alphabetischem Namen, damitcat *
sie zusammengefügt werden können.Ein Nachteil des
cat
Verbindens ist, dass es nicht robust gegen häufige Fehlermodi ist. Wenn eine der Dateien abgeschnitten ist oder fehlt,cat
werden Sie nicht beschweren, sondern nur eine beschädigte Ausgabe erhalten.Es gibt Komprimierungsdienstprogramme, die mehrteilige Archive erstellen, z. B.
zipsplit
undrar -v
. Sie sind nicht sehr unixy, weil sie zusätzlich zum Teilen komprimieren und packen (mehrere Dateien zu einer zusammenfügen) (und umgekehrt zusätzlich zum Verbinden entpacken und dekomprimieren). Sie sind jedoch nützlich, um zu überprüfen, ob Sie alle Teile haben und ob die Teile vollständig sind.quelle
Nur dass das nicht wirklich passiert. Die Shell verbindet das stdout von
cat
direkt mit der geöffneten Datei, was bedeutet, dass "stdout durchlaufen" dasselbe ist wie auf die Festplatte schreiben.quelle
cat
. Vielen Dank, dass Sie mich über die direkte Verbindung informiert haben.Ich hatte einmal genau dieses Problem: Ich wollte einige Dateien zusammenfügen, hatte aber nicht genug Speicherplatz, um sie doppelt zu speichern.
Also schrieb ich eine Reihe von Programmen:
Dies ermöglichte es mir, so etwas zu tun
und so die Quelldatei zu entfernen, während 128M noch ungeschrieben war. Ein bisschen gefährlich, aber wenn die Daten nicht so wertvoll sind oder auch woanders existieren, ist das machbar.
Bei Bedarf kann ich die Quelle zur Verfügung stellen.
quelle
Technisch gesehen ist dies eine Möglichkeit, auf die gesamte Datei zuzugreifen, ohne den gesamten Inhalt lesen und schreiben zu müssen. Dies kann nützlich sein, wenn große Dateien vorhanden sind oder nur noch wenig Speicherplatz zur Verfügung steht:
Und dann
myImage.iso
zum Beispiel verwendenObwohl es sich natürlich
myImage.iso
um eine spezielle Datei (Named Pipe) und nicht um eine reguläre Datei handelt, kann dies von Nutzen sein oder auch nicht, je nachdem, was Sie versuchen.quelle
Aufteilen von Dateien
Nach Größe aufteilen
Wenn Sie große Dateien in kleine Dateien aufteilen und den Namen und die Größe kleiner Ausgabedateien auswählen möchten, ist dies der richtige Weg.
Auf diese Weise können Sie eine große Datei in kleinere Teile von 500 MB aufteilen. Außerdem möchten Sie, dass die Namen der Teiledateien SmallFile sind. Beachten Sie, dass Sie einen Punkt nach dem Dateinamen benötigen . Das Ergebnis sollte die Erzeugung neuer Dateien sein:
Nach Anzahl der Zeilen teilen
Auf diese Weise teilen Sie Textdateien in kleinere Dateien auf, die auf 50 Zeilen begrenzt sind.
Das Ergebnis sollte ungefähr so aussehen:
Nach Bytes teilen
In kleine Dateien mit einer benutzerdefinierten Größe von kleinen Dateien in Bytes aufteilen:
Das Ergebnis sollte ähnlich dem Ergebnis aus Teilen nach Anzahl der Zeilen sein .
Dateien verbinden
Sie können Dateien auf zwei Arten verbinden. Der erste ist:
oder mit:
Hinweis: Wenn Sie Dateien zusammenfügen, sollten kleine Dateien nicht beschädigt werden. Auch sollten sich alle kleinen (Teil-) Dateien im selben Verzeichnis befinden.
quelle