それこそが cat
のために作られました。これは最も古い GNU ツールの 1 つであるため、他のツールがこれほど高速で優れているとは考えにくいと思います。 パイピングではありません - 出力をリダイレクトするだけです。
ボンネットの下
最初のファイルをコピーし、その後に 2 番目のファイルをコピーするよりも効率的な方法はありません。両方の DOS copy
と cat
そうしてください。
各ファイルは、ディスク上の他のファイルとは別に保存されます。ディスクのようなデバイスにデータを保存するように設計されたほとんどすべてのファイルシステムは、ブロック単位で動作します。何が起こるかを非常に単純化して示します。ディスクは、たとえば 1kB のブロックに分割され、オペレーティング システムはファイルごとに、それを構成するブロックのリストを保存します。ほとんどのファイルの長さは整数のブロック数ではないため、最後のブロックは部分的にしか占有されていません。実際には、ファイルシステムには、いくつかのファイル間で最後の部分ブロックを共有したり、「ブロック 46798、ブロック 46799、…」ではなく「ブロック 46798 から 47913」を保存したりするなど、多くの最適化があります。オペレーティング システムが新しいファイルを作成する必要がある場合、空きブロックを探します。ブロックは連続している必要はありません。ブロック 4、5、98、および 178 だけが空いている場合でも、4kB のファイルを保存できます。バイト レベルに下げるのではなくブロックを使用すると、新しいファイルや拡大するファイルの空きブロックを見つけるのが大幅に高速になり、大量のファイルを作成、拡大、削除、または縮小する際の断片化による問題が軽減されます (穴)
ファイルの途中で部分ブロックをサポートできますが、特にファイルに非順次アクセスする場合はかなり複雑になります。10340 番目のバイトにジャンプするには、11 番目のブロックの 100 番目のバイトにジャンプできなくなります。介在するすべてのブロックの長さをチェックします。
ブロックを使用すると、2 つのファイルを結合することはできません。一般に、最初のファイルはブロックの途中で終わるからです。確かに、特殊なケースが考えられますが、連結時に両方のファイルを削除したい場合のみです。これは、まれな操作の非常に具体的な処理になります。典型的なファイルシステムでは、多くのファイルが同時にアクセスされるため、このような特別な処理は単独では機能しません。したがって、最適化を追加する場合は、慎重に検討する必要があります。関連するファイルの 1 つを他のプロセスが読み取っている場合はどうなるでしょうか。誰かが A と C を連結しているときに、誰かが A と B を連結しようとするとどうなりますか?等々。全体として、このまれな最適化は大きな負担になります。
全体として、他の場所で大きな犠牲を払わずに、ファイルの結合をより効率的にすることはできません。その価値はありません。
分割と結合について
split
と cat
ファイルを分割および結合する簡単な方法です。 split
cat *
となるように、アルファベット順に名前が付けられたファイルを作成します。
cat
の欠点 参加の理由は、一般的な障害モードに対して堅牢ではないということです。ファイルの 1 つが切り詰められているか見つからない場合、cat
文句を言うことはありません。出力が破損するだけです。
zipsplit
などのマルチパート アーカイブを生成する圧縮ユーティリティがあります。 そして rar -v
.それらは、分割に加えて圧縮およびパック (複数のファイルを 1 つにまとめる) (および逆に、結合に加えてアンパックおよび解凍) するため、あまり unixy ではありません。しかし、それらは、すべての部品が揃っていること、および部品が完全であることを確認するという点で役立ちます。
<ブロック引用>
システムの stdin
を介してすべてのコンテンツをパイプするよりも効率的な方法があるはずです / stdout
それが実際に起こっていることではないことを除いて。シェルは cat
の stdout を接続しています 直接 つまり、「stdout を通過する」ことは、ディスクに書き込むことと同じです。