
シェル コマンドを使用してバイナリ ファイルを効率的にマージしたいのですが、次のような古典的な方法がすぐに見つかりました。
cat file1 file2 > file3
悪くはないが:
- 遅いです。IO アクセスが遅いです。
- 追加のスペースが必要です。ファイルをコピーしたくありません。連結するだけです。
ファイルシステムはファイルの断片化を処理するのに最適です。このメカニズムを使用してファイルを結合することはできないのでしょうか?
答え1
あなたはこれを行うことができます:
cat file2 file3 [...] filen >> file1
file2
これは、、、file3
...をインプレースfilen
の末尾に連結します。演算子はシェルに、file1
>>
ファイルの終わり。
ファイルシステムを利用して「ファイルの断片化を処理」したいとします。残念ながら、これを実現する一般的な方法はありません。これは、「ファイルシステム」がディスク上のファイルシステムよりもはるかに一般的であるためです。たとえば、NFS、ヒューズ、そしてあらゆる種類のリソース(ブロックデバイスハードディスクなどのデバイスをファイルシステム階層として扱うことはできません。ブロックデバイスベースのファイルシステムであっても、これを行うための標準的なメカニズムはなく、実装固有のメカニズムも知りません。
答え2
list.txt
ファイル名を改行で区切って、テキスト ファイルに順番に入力します。次に、bash でこれを実行します。
while read line; do echo -n . ; dd if="$line" of=out status=none conv=notrunc oflag=append; done < list.txt
これにより、現在のディレクトリに連結ファイル「out」が作成されます。
答え3
dd if=firstfile.raw > completedfile.raw
dd if=nfile.raw >> completedfile.raw
dd if=lastfile.raw >> completedfile.raw