Genau das ist cat
wurde für 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 keine Rohrleitung - Es leitet nur die Ausgabe um.
Unter der Haube
Es gibt keinen effizienteren Weg, als die erste Datei zu kopieren, dann die zweite Datei danach zu kopieren und so weiter. Beide DOS copy
und cat
mach das.
Jede Datei wird unabhängig von anderen Dateien auf der Platte gespeichert. Fast jedes Dateisystem, das zum Speichern von Daten auf einem festplattenähnlichen Gerät entwickelt wurde, arbeitet blockweise. Hier ist eine stark vereinfachte Darstellung dessen, was passiert:Die Festplatte wird in Blöcke von beispielsweise 1 KB unterteilt, und das Betriebssystem speichert für jede Datei die Liste der Blöcke, aus denen sie besteht. Die meisten Dateien sind keine ganze Zahl von Blöcken lang, daher ist der letzte Block nur teilweise belegt. In der Praxis haben Dateisysteme viele Optimierungen, wie das Teilen des letzten Teilblocks zwischen mehreren Dateien oder das Speichern von „Blöcken 46798 bis 47913“ statt „Block 46798, Block 46799, …“. Wenn das Betriebssystem eine neue Datei erstellen muss, sucht es nach freien Blöcken. Die Blöcke müssen nicht fortlaufend sein:Wenn nur die Blöcke 4, 5, 98 und 178 frei sind, können Sie immer noch eine 4kB-Datei speichern. Die Verwendung von Blöcken, anstatt auf die Byte-Ebene zu gehen, hilft dabei, freie Blöcke für eine neue oder wachsende Datei erheblich schneller zu finden, und reduziert die Probleme aufgrund von Fragmentierung, wenn Sie viele Dateien erstellen oder vergrößern und löschen oder verkleinern (wobei eine zunehmende Anzahl von Löcher).
Sie könnten Teilblöcke in der Mitte der Datei unterstützen, aber das würde die Komplexität erheblich erhöhen, insbesondere wenn Sie nicht sequenziell 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.
Aufgrund der Verwendung von Blöcken können Sie nicht einfach zwei Dateien zusammenfügen, da die erste Datei im Allgemeinen in der Mitte des Blocks endet. Sicher, Sie könnten einen Sonderfall haben, aber nur, wenn Sie beim Verketten beide Dateien löschen möchten. Das wäre eine sehr spezifische Handhabung für eine seltene Operation. Eine solche spezielle Behandlung lebt 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? Usw. Alles in allem wäre diese seltene Optimierung eine enorme Belastung.
Alles in allem können Sie das Zusammenführen von Dateien nicht effizienter gestalten, ohne an anderer Stelle große Abstriche zu machen. Es lohnt sich nicht.
Vom Teilen und Verbinden
split
und cat
sind einfache Methoden zum Aufteilen und Zusammenführen von Dateien. split
kümmert sich um die Erstellung von Dateien, die in alphabetischer Reihenfolge benannt sind, sodass cat *
funktioniert für den Beitritt.
Ein Nachteil von cat
für das Fügen ist, dass es nicht robust gegenüber üblichen Fehlermodi ist. Wenn eine der Dateien abgeschnitten ist oder fehlt, cat
wird sich nicht beschweren, Sie erhalten nur eine beschädigte Ausgabe.
Es gibt Komprimierungsprogramme, die mehrteilige Archive erzeugen, wie z. B. zipsplit
und rar -v
. Sie sind nicht sehr unixy, da sie zusätzlich zum Teilen komprimieren und packen (mehrere Dateien zu einer zusammenfügen) (und umgekehrt zusätzlich zum Verbinden entpacken und dekomprimieren). Aber sie sind insofern nützlich, als sie bestätigen, dass Sie alle Teile haben und dass die Teile vollständig sind.
Anscheinend sollte es einen effizienteren Weg geben, als den gesamten Inhalt durch den stdin
des Systems zu leiten / stdout
Nur dass das nicht wirklich passiert. Die Shell verbindet die Standardausgabe von cat
direkt in die geöffnete Datei, was bedeutet, dass das "Durchlaufen von stdout" dasselbe ist wie das Schreiben auf die Festplatte.