rsync --link-dest
省スペースのためのスナップショット実際にどのくらいのスペースを節約するのか、どうすればわかりますか?またはより一般的に:
他の場所にハードリンクされていないファイルのみを考慮してディレクトリが使用するスペースを計算する方法外部ディレクトリ構造?別の方法で質問します。このディレクトリを削除すると、実際にどのくらいのスペースが確保されますか? (
du -hs
おそらく嘘です。ハードリンク自体に必要なスペースを含めることができます)
答え1
内部ハードリンクがないと仮定すると(つまり、2つ以上のハードリンクを持つすべてのファイルがツリー外でリンクされている場合)、次のことができます。
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
リンク数、inode、およびディスク使用量を印刷します。sort | uniq -c
リスト(ツリーの発生回数、リンク数、inode、ディスク使用量)を取得するためにこのリストを渡します。
私たちは渡すそれ最初のフィールド(発生回数)がawk
2番目のフィールド(ハードリンク数)以上である場合、つまりツリーの外側にファイルへのリンクがないことを意味し、4番目のフィールド(ディスク使用法)はプラス記号とバックスラッシュで印刷します。になります。
最後に a を出力するので、0
数式が構文上正しいので(そうでなければ en となります+
)、それを に渡しますbc
。
(しかし、十分な答えを得ることができれば、より簡単な最初のアプローチを使用します。)
答え2
デフォルトでは、すべてのファイル(ディレクトリではない)のinode番号とリンク数を取得し、そのリンク数を各inodeの発生回数と比較し、異なる場合はファイルを除外する必要があります。
どちらも同じファイルシステムにあると仮定すると、次のように動作します(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
}'
答え3
du
実際に嘘はしません。 ;) 同じ inode を指すすべてのハードリンクのうち最初のリンクのみを計算して、そのディレクトリを確認します。
単一のディレクトリで何を見るかを尋ねる場合は、du
同じコンテンツを指す別のハードリンクがあるかどうかは関係ありません。
$ du -h daily.0 && du -hc daily.1
29G /daily.0
29G /daily.1
次に、そのディレクトリを同じ行に配置します(最も最近の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」ですでに参照されているinode(別名「実際の」ファイル)を参照する「daily.1」のファイルはすべてカウントされません。
したがって、daily.1を削除すると、デバイススペースが364MB節約されます。
削除する