web-dev-qa-db-ja.com

削除された(まだ開いている)ファイルをサイズで並べ替える

これにより、(まだ開いている)スペースを占有しているファイルシステム内の削除されたファイルのリストが表示されます。

find /proc/*/fd -ls 2>/dev/null | grep '(deleted)'

ただし、ファイル記述子のパイプファイル名はサイズ0を返します。

find /proc/*/fd -ls 2>/dev/null | grep '(deleted)' \
    | sed 's!.*\(/proc[^ ]*\).*!\1!' | xargs ls -lhas

まだコンテンツがあるので、wc -cを使用するとサイズがわかります。

find /proc/*/fd -ls 2>/dev/null | grep '(deleted)' \ 
     | sed 's!.*\(/proc[^ ]*\).*!\1!' | xargs wc -c | sort -nr |head -n 20

例:

2809946696 total
2387677184 /proc/15050/fd/26
  67108864 /proc/1626/fd/23
  67108864 /proc/1059/fd/6
  10485760 /proc/11417/fd/298
  10485760 /proc/11417/fd/239
  10485760 /proc/11417/fd/155
  10485760 /proc/11366/fd/499

ただし、(wc -cとしてマークされたファイル記述子の(deleted)よりも)どのファイルが最もスペースを占めているかを見つけるためのより良い方法はありますか? (またはさらに良いことに、削除されたファイルのハンドルを開いたままにしておくと、どのプロセスがほとんどのスペースを占有しますか?)

zshを使用すると、

ls -lLrS /proc/*/fd/*(-l0)

それらをファイルサイズ順にリストします(wc -cのように、ディスク使用量ではありません)。

ディスク使用量については、次のことができます。

zmodload zsh/stat
bydu() zstat -A REPLY +block -- $REPLY
ls -lLsU /proc/*/fd/*(-l0no+bydu)

(GNU lsはソートしない場合は-Uであると仮定)

プロセスごとのディスク使用量については、次のことができます。

typeset -aU proc=(/proc/*/fd/*(-l0.:h:h:t))
for p ($proc) {du -Hksc /proc/$p/fd/*(-.l0) | sed -n "\$s/total\$/$p/p"} | sort -n

(ここではキビバイト単位)

1