rsync --link-dest
スペース節約スナップショットを使用して、実際にどのくらいのスペースを節約したかを知るにはどうすればよいですか?またはより一般的な:
ディレクトリ構造以外の場所でハードリンクされていないファイルのみを考慮して、ディレクトリがどのくらいのスペースを使用しているかを調べる方法は?別の質問:そのディレクトリを削除すると、実際にどれだけのスペースが解放されますか?(
du -hs
うそになるでしょう。ハードリンク自体に必要なスペースが含まれる場合があります)
rsync --link-dest
スペース節約スナップショットを使用して、実際にどのくらいのスペースを節約したかを知るにはどうすればよいですか?またはより一般的な:
ディレクトリ構造以外の場所でハードリンクされていないファイルのみを考慮して、ディレクトリがどのくらいのスペースを使用しているかを調べる方法は?別の質問:そのディレクトリを削除すると、実際にどれだけのスペースが解放されますか?(
du -hs
うそになるでしょう。ハードリンク自体に必要なスペースが含まれる場合があります)
回答:
内部ハードリンクがない(つまり、複数のハードリンクを持つすべてのファイルがツリーの外部からリンクされている)と仮定すると、次のことができます。
find . -links -2 -print0 | du -c --files0-from=-
編集そして、ここにコメントでスケッチしたものを適用しました。なしのみdu
; 気づいた@StephaneChazelasへの称賛du
は必要ありません。最後に説明。
( find . -type d -printf '%k + ' ; \
find . \! -type d -printf '%n\t%i\t%k\n' | \
sort | uniq -c | \
awk '$1 >= $2 { print $4 " +\\" }' ; \
echo 0 ) | bc
行うことは、関連するすべてのファイルのディスク使用量(KB)をプラス記号で区切った文字列を作成することです。それから、その大きな追加をに送りbc
ます。
最初のfind
呼び出しは、ディレクトリに対してそれを行います。
2番目find
は、リンクカウント、iノード、およびディスク使用量を出力します。このリストを渡してsort | uniq -c
、リスト(ツリー内の表示数、リンク数、iノード、ディスク使用量)を取得します。
私たちは、合格することをリストawk
、最初のフィールド(外観の数)が2番目(ハードリンクの数)以上である場合、つまりツリーの外側からこのファイルへのリンクがないことを意味し、4番目のフィールド(ディスク使用量)プラス記号とバックスラッシュが添付されています。
最後にaを出力する0
ので、式は構文的に正しく(+
そうでなければenになります)、それをに渡しbc
ます。ふう。
(ただし、十分な答えが得られる場合は、より単純な最初の方法を使用します。)
find
、すべてのファイルとそのiノードおよびリンクカウントのリストを印刷するために使用する必要があります。次に、いくつかの組み合わせを使用sort | uniq -c
して、各iノードがツリーに表示される回数を取得し、リンクカウントが出現回数よりも大きいものを除外してから、そのリストをにフィードしますdu
。ただし、要件が満たされている場合は、労力を節約してください。
du
た-d
パラメータのみがあった場合ls
btrfs
ファイルシステム、ディレクトリのリンク数は常に1
あなたが追加する必要があると思いますので、! -type d
基本的に、すべてのファイル(ディレクトリ以外)のiノード番号とリンク数を取得し、そのリンク数を各iノードの発生数と比較し、それらが異なる場合はファイルを除外する必要があります。
すべてが同じファイルシステム上にあると仮定すると、次のようなものが機能するはずです(GNU findを使用):
find . -type d -printf '%k\n' -o -printf '%i %n %k\n' |
awk '
NF==1{t+=$0; next}
{n1[$1]=$2; n2[$1]++; s[$1]=$3}
END {
for (i in n1)
if (n1[i] == n2[i])
t+=s[i]
print t
}'
%k
報告されたものについて完全に間違っていた。それdu
は素晴らしい、まったく必要ありません!家に帰ったら答えを更新します。ありがとう!
du
実際に嘘をつくことはありません;)検出されたdir(s)を解析し、遭遇した同じiノードを指すすべてのハードリンクの最初のもののみをカウントします。
du
1つのディレクトリでのみ何を見るかを尋ねると、同じコンテンツを指す他のハードリンクがあるかどうかは気にしません。
$ du -h daily.0 && du -hc daily.1
29G /daily.0
29G /daily.1
ここで、同じ行にdirsを指定します(rsync増分バックアップの最新の行から開始します--link-dest
)。
$ du -hc daily.0 daily.1
29G /daily.0
364M /daily.1
29G total
または、バックアップディレクトリ全体:
$ du -hc --max-depth=1 /snapshots
29G /daily.0
364M /daily.1
537M /daily.2
333M /daily.3
30G total
「daily.0」ですでに参照されているiノード(別名「実際の」ファイル)を参照する「daily.1」のファイルはカウントされません。
したがって、daily.1を削除すると、デバイスに364MB節約されます。
削除する
du
は、-l
/--count-links
オプションを使用しない限り、ファイルサイズがハードリンクされている場合でもファイルサイズを1回だけカウントします。このdu
オプションを使用して、または使用せずにツリー全体で2回実行します。サイズの違いは、すべてのディレクトリで保存したスペースの量です。