大容量ファイルをコピーせずに互いに添付

大容量ファイルをコピーせずに互いに添付

5つの大容量ファイル(ファイル1、ファイル2、..ファイル5)がそれぞれ約10Gで、ディスクに残っている空き容量が非常に少ないため、これらすべてのファイルを1つに接続する必要があります。元のファイルをアーカイブする必要なく、最終ファイルのみをアーカイブするだけです。

cat通常の接続はファイル順に行われますfile2. file5:

cat file2 >> file1 ; rm file2

残念ながら、この方法を使用するには少なくとも10Gの空き容量が必要ですが、私にはそのような空き容量はありません。ファイルを実際にコピーせずにリンクする方法はありますか?しかし、ファイルシステムは、file1が元のfile1の終わりから終わらず、file2が始まるところで続くことを何らかの方法で知らせることができますか?

PS重要な場合、ファイルシステムはext4です。

ベストアンサー1

AFAIK残念ながら、最初からファイルを切り捨てることは不可能です(標準ツールでは適用できますが、システムコールレベルでは適用されません)。ねえ)。ただし、いくつかの複雑さが追加され、通常の切り捨て(スパスファイルを使用)を使用できます。間にすべてのデータを書き込むことなく、ターゲットファイルの最後に書き込むことができます。

まず、これら2つのファイルのサイズが正確に5GiB(5120MiB)で、一度に100MiBを移動するとします。以下を含むループを実行します。

  1. ソースファイルの終わりからターゲットファイルの終わりまでブロックをコピーします(消費されるディスク容量が増えます)。
  2. ソースファイルの一部を切り捨てる(ディスクスペースを解放)

    for((i=5119;i>=0;i--)); do
      dd if=sourcefile of=targetfile bs=1M skip="$i" seek="$i" count=1
      dd if=/dev/zero of=sourcefile bs=1M count=0 seek="$i"
    done
    

しかし、まず、より小さなテストファイルを試してみてください...

おそらくファイルのサイズが同じでもブロックサイズの倍数でもないかもしれません。この場合、オフセット計算はより複雑になる。その後、使用する必要がseek_bytesありますskip_bytes

これが気に入っていますが、詳細についてお手伝いが必要な場合は、もう一度お問い合わせください。

警告する

ブロックサイズによって、dd結果ファイルは断片化の悪夢になります。

おすすめ記事