バックアップにはrsnapshotを使用します。これにより、同じ名前のファイルを含む一連のフォルダーが生成されます。一部のファイルはハードリンクされていますが、他のファイルは個別です。たとえば、hourly.1/file1
とhourly.2/file1
は完全に別のファイルですが、hourly.1/file2
とhourly.2/file2
は同じファイルにハードリンクされている場合があります。
フォルダhourly.2
無視hourly.1
内のファイルへのハードリンクであるファイルが使用しているスペースの量を確認したい。したがって、上記の例では、file2のサイズを取得しますが、file1は無視します。
私はLinuxでbashを使用していますが、これをコマンドラインからできるだけ簡単に実行したいので、大きなグラフィックや他のOSのみのソリューションは使用しないでください。
リンクが1つしかないhourly.2
のすべてのファイルの合計サイズ(バイト):
$ find ./hourly.2 -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s}'
find
のマンページから:
-links n
File has n links.
バイトではなくキロバイトで合計を取得するには、-printf "%k\n"
を使用します
異なるリンク数のファイルを一覧表示するには、find -links +1
(複数のリンク)、find -links -5
(5つ未満のリンク)などを試してください。
hourly.2
の下ではなく、hourly.1
の下にあるファイルのサイズが特に必要な場合は、du
を使用して少し間接的に取得できます。 du
が同じファイルを複数回処理する場合(異なる名前、つまりハードリンクの下でも)、ファイルは最初にカウントされるだけです。したがって、du hourly.1 hourly.2
がhourly.2
について報告するのは、探しているサイズです。したがって:
du -ks hourly.1 hourly.2 | sed -n '2s/[^0-9]*//p'
(すべてのPOSIXシステムおよび他のほとんどのUnixバリアントで動作します。ディレクトリ名hourly.1
に改行が含まれていないと想定しています。)
@Gillesが言うように、du
は、遭遇した同じiノードを指しているすべてのハードリンクの最初のみをカウントするため、行にディレクトリを与えることができます。
$ du -hc --max-depth=0 dirA dirB
29G /hourly.1
1G /hourly.2
30G total
つまり「hourly.1」ですでに参照されているiノード(別名「実際の」ファイル)を参照する「hourly.2」のファイルはカウントされません。
よりシンプル
du -hc --max-depth=1 path/
例
9.4G daily/users/rockspa/home/daily.21
3.6G daily/users/rockspa/home/daily.30
4.2G daily/users/rockspa/home/daily.11
1.1G daily/users/rockspa/home/daily.4
4.2G daily/users/rockspa/home/daily.9
3.0G daily/users/rockspa/home/daily.25
3.5G daily/users/rockspa/home/daily.20
4.2G daily/users/rockspa/home/daily.13
913M daily/users/rockspa/home/daily.5
2.8G daily/users/rockspa/home/daily.26
1.4G daily/users/rockspa/home/daily.1
2.6G daily/users/rockspa/home/daily.28
4.2G daily/users/rockspa/home/daily.15
3.8G daily/users/rockspa/home/daily.19
327M daily/users/rockspa/home/daily.8
4.2G daily/users/rockspa/home/daily.17
3.1G daily/users/rockspa/home/daily.23
...
驚くほど、BusyBoxのfind
のビルドには-printf
のサポートがありません。これは @ grebnekeの回答 の修正です。
find . -type f -links 1 -exec ls -l {} \;| awk '{s=s+$5} END {print s}'