ファイルを分割して再びマージする最善の方法は何ですか?

ファイルを分割して再びマージする最善の方法は何ですか?

大きなファイルがあり、それを100 MBチャンクに分割する必要がある場合は、これを行います。

split -b 100m myImage.iso

これは通常私に次のようなものを与えます

xaa
xab
xac
xad

また合わせるために使ってきました。

cat x* > myImage.iso

ファイルセットのすべてのコード行を読み取り、出力を新しいファイルにリダイレクトするよりもcat効率的な方法が必要になると思います。 2つのファイルを開くのと同じように、EOF最初のファイルからタグを削除してリンクします。すべてのアイテムを閲覧する必要はありません。

Windows / DOSにはバイナリファイルのコピーコマンドがあります。ヘルプでは、このコマンドは複数のファイルをマージできるように設計されていると言われています。次の構文を使用します。 (/bバイナリモードの場合)

copy /b file1 + file2 + file3 outputfile

Linuxで大容量ファイルをリンクするためのcatに似ているか、より良い方法はありますか?

修正する

cat実際、これがファイルをリンクする最も正確で最善の方法のようです。正しいコマンドを使っていて幸いです。 :) フィードバックを送ってくれた皆さんに感謝します。

答え1

それだけです。catはい。最も古いGNUツールの1つなので、他のツールがこれをより速くよりよく実行する可能性はほとんどないと思います。これはない管路- 出力をリダイレクトするだけです。

答え2

フード

最初のファイルをコピーしてから2番目のファイルをコピーするよりも効率的な方法はありません。 DOSはこれを行うことができcopyます。cat

各ファイルはディスク上の他のファイルとは独立して保存されます。ディスクなどのデバイスにデータを格納するように設計されたほぼすべてのファイルシステムは、ブロックとして機能します。以下は、何が起こるかについての非常に単純化されたデモです。ディスクは 1kB ブロックに分割され、オペレーティングシステムはファイルごとにファイルを構成するブロックのリストを保存します。ほとんどのファイルは整数ではなくブロック長を持つため、最後のブロックは部分的にのみ埋められます。実際、複数のファイル間で最後の部分ブロックを共有したり、「ブロック46798、ブロック46799...」の代わりに「ブロック46798〜47913」を保存するなど、ファイルシステムの最適化がたくさんあります。オペレーティングシステムは、新しいファイルを生成する必要があるときに利用可能なブロックを探します。ブロックが連続している必要はありません。ブロック4、5、98、および178のみが空の場合、4 kBファイルを保存できます。バイトレベルにドリルダウンする代わりに、ブロックを使用すると、新しいファイルまたは増分ファイルの使用可能なブロックをすばやく見つけることができます。 (複数のファイルの後に多くのファイルが残ります)。

ファイルの途中で部分ブロックをサポートすることができますが、これは特にファイルに非順次アクセスするときにかなりの複雑さを追加します。 10340番目のバイトにジャンプするには、11番目のブロックを100バイトにジャンプすることはできません。各中間ブロックの長さ。

チャンクの使用を考慮すると、通常、最初のファイルがチャンクの途中で終了するため、2つのファイルを単にリンクすることはできません。もちろん、特別な場合がありますが、接続中に両方のファイルを削除したい場合にのみ当てはまります。これはまれな操作のための非常に具体的な処理です。一般的なファイルシステムでは、多くのファイルが同時にアクセスされるため、この特殊な処理はそれ自体は存在しません。したがって、最適化を追加するには慎重に考える必要があります。他のプロセスが関連ファイルの1つを読んでいる場合はどうなりますか? AとCが接続されているときに誰かがAとBを接続しようとするとどうなりますか?など。全体的に、この珍しい最適化は大きな負担になります。

通常、他の場所で大幅な犠牲を払わないと、ファイル接続をより効率的にすることはできません。それは価値がありません。

分割とマージ情報

splitcatファイルを分割してマージする簡単な方法です。接続にsplit適したアルファベット順に名前付きファイルを生成する役割を担います。cat *

結合の1つの欠点catは、一般的な失敗モードには強力ではないことです。ファイルの1つが切り捨てられていなくてもcat文句を言わず、破損した出力のみを受け取ります。

zipsplitなどのマルチパートアーカイブを作成できる圧縮ユーティリティがありますrar -v。分割に加えて、圧縮と圧縮(複数のファイルを単一のファイルにまとめる)も実行するため、非常に均一ではありません。逆に、接続に加えて、解凍と解凍も行われます。しかし、すべての部品があり、部品が完全であることを確認するので便利です。

答え3

システム/パイプを介してすべてをstdinパイプするよりも効率的な方法が必要です。stdout

しかしそれは真実ではない。接続するシェルの標準出力cat まっすぐ開いたファイルに保存します。これは「stdout経由」を意味し、ディスクに書き込むのと同じです。

答え4

かつてこのような問題がありました。いくつかのファイルを結合したかったが、そのファイルを収容するのに十分なディスク容量がありませんでした。

だから私はいくつかのプログラムを書いた。

  • 1つは、ファイルを読み取り、標準出力に送信し、完了したら削除してファイルを「吸収」することです。
  • 1つは、データの「動的」バッファリング用です。

これにより、次のことができます。

partto sourcefile | mybuffer 128M >>cumufile

したがって、128Mが作成されていない間にソースファイルを削除します。少し危険ですが、データがあまり貴重ではない場合、または他の場所にも存在する場合は可能です。

必要に応じてソースコードを提供できます。

関連情報