web-dev-qa-db-ja.com

ハードリンクを無視してフォルダーサイズを取得する方法

バックアップにはrsnapshotを使用します。これにより、同じ名前のファイルを含む一連のフォルダーが生成されます。一部のファイルはハードリンクされていますが、他のファイルは個別です。たとえば、hourly.1/file1hourly.2/file1は完全に別のファイルですが、hourly.1/file2hourly.2/file2は同じファイルにハードリンクされている場合があります。

フォルダhourly.2無視hourly.1内のファイルへのハードリンクであるファイルが使用しているスペースの量を確認したい。したがって、上記の例では、file2のサイズを取得しますが、file1は無視します。

私はLinuxでbashを使用していますが、これをコマンドラインからできるだけ簡単に実行したいので、大きなグラフィックや他のOSのみのソリューションは使用しないでください。

18
Benubird

リンクが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つ未満のリンク)などを試してください。

8
grebneke

hourly.2の下ではなく、hourly.1の下にあるファイルのサイズが特に必要な場合は、duを使用して少し間接的に取得できます。 duが同じファイルを複数回処理する場合(異なる名前、つまりハードリンクの下でも)、ファイルは最初にカウントされるだけです。したがって、du hourly.1 hourly.2hourly.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」のファイルはカウントされません。

9
tuk0z

よりシンプル

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}'
1
okigan