追加のディスク容量を消費せずにファイルの編集コピーを作成できますか?

追加のディスク容量を消費せずにファイルの編集コピーを作成できますか?

大きなファイルがある場合は、ln追加のディスク容量を消費せずにそのファイルの「コピー」を作成するために使用できます。しかし、私がそれをしたくない場合はどうですか?精密文書のコピー?ファイル全体をコピーし、ディスク容量を2倍にすることなく、わずかな修正でファイルの新しいバージョンを作成する方法はありますか?

私の動機は、急流からダウンロードしたmp3ファイルのid3タグを編集することです。ダウンロードしたファイルを直接編集するとシーディングがめちゃくちゃになるので望ましくありませんが、一部のid3タグのヘッダを編集するためにファイルをコピーしてディスク容量を倍増したくありません。

ベストアンサー1

その機能が組み込まれていないプログラムを使用する場合、書く新しい情報は何らかの方法で基本ファイルを介して渡され、ファイルを使用するアプリケーションに透過的にファイルシステムレベルでこの問題を解決する必要があります。複数のバージョンを提供しても、スペース要件のために改訂管理システムだけでは十分ではありません。

見ることができる1つは、ファイルをBtrfsファイルシステムに保存し、元のファイルを「オリジナル」スナップショットに入れてから、このスナップショットに基づくビューに更新されたバージョンを置くことです。これはID3v1タグ(ファイルの終わりなので)とID3v2タグを持つファイルに対してうまく機能します。ただし、変更には十分な空き容量があり、MP3ファイルを再作成する必要はありません。したがって、ファイルによって変更された物理ブロックのみが追加のディスク容量を占有します。

元のファイルに追加のファイルを追加する場合は、cp --reflink src dst後で追加されるすべてのファイルを明示的に説明する必要があります。その後、ダウンロードは元のバージョン、id3エディタ(たとえばpicard)、および音楽プレーヤーと共に派生したビューで使用されます。このビューでは、変更されていない(またはまだ変更されていない)ファイルは元のファイルと同じように見えます。

/data0はい(Btrfsボリュームonとtest.mp3file onで始まる/tmp):

/data0$ btrfs subvolume create /data0/mp3org
Create subvolume '/data0/mp3org'
/data0$ cp /tmp/test.mp3 mp3org/
/data0$ btrfs subvolume snapshot /data0/mp3org/ /data0/id3update
Create a snapshot of '/data0/mp3org/' in '/data0/id3update'

これで、ファイルは両方のディレクトリ(および)で使用できるようになりましたtest.mp3mp3orgid3update

/data0$ ls -l /data0/mp3org
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3
/data0$ ls -l /data0/id3update/
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3

スナップショットの項目を変更します。

/data0$ id3v2 -c "This is a change" id3update/test.mp3
/data0$ ls -l /data0/mp3org
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3
/data0$ ls -l /data0/id3update/
total 7608
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:24 test.mp3

ファイルサイズは変更されていませんが、2番目のファイルの内容は変更されました。これは、コメントが元のファイルの予約済みスペースであるid3v2に収まるためです。

/data0$  grep -F "is a change" mp3org/* id3update/*
Binary file id3update/test.mp3 matches

元のサブボリュームから別のファイルをコピーしても、次の場所には表示されませんid3update

/data0$ cp /tmp/test.mp3 mp3org/abc.mp3
/data0$ ls -l mp3org/ id3update/
id3update/:
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:24 test.mp3

mp3org/:
total 15200
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:28 abc.mp3
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3

参照リンクの明示的なコピーを作成します。

/data0$ cp --reflink mp3org/abc.mp3 id3update/
/data0$ ls -l mp3org/ id3update/
id3update/:
total 15200
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:29 abc.mp3
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:24 test.mp3

mp3org/:
total 15200
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:28 abc.mp3
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3

新しいファイルを変更します。

/data0$ id3v2 -c "another file change" id3update/abc.mp3
/data0$ grep -F change mp3org/* id3update/*
Binary file id3update/abc.mp3 matches
Binary file id3update/test.mp3 matches

自動的に入力された場合、ターゲットがまだ存在しない場合は、実行するスクリプトを定期的に実行して最新の状態に保つmp3orgことができます。id3updatecp --reflink src dst

¹最も頻繁にファイルの先頭に表示されます。

おすすめ記事