macOS:duが誤ったディスク使用量を報告する可能性はありますか?

macOS:duが誤ったディスク使用量を報告する可能性はありますか?

私のボリュームの特定の場所でテストされているスクリプトがあり、その一部はディスク使用量と合計データサイズを計算することです。すべてが大丈夫です。私が取得する値は、mdlsmacOS自体が出力情報とFinder情報によって報告される値と常に一致します。

ところで、Homebrewのインストールディレクトリからスクリプトを実行すると、/usr/local/Cellar出力は奇妙です。ディスク使用量は3,234,828,288バイト単位ですが、データサイズは実際にはより大きい単位です3,254,656,870。 rootでスクリプトを実行したりGNU-duを使用したりすると、同じ結果が得られます。ディスク使用量は常にデータサイズより高くする必要はありませんか? (もちろん、HFS +圧縮を使用しない限り、ここではそうではありません。出力に「圧縮」ファイルフラグがありませんls。)

以下はスクリプトの関連部分です。まず、ディスク使用量と総データを表示します。

FILEPATH="/usr/local/Cellar"
DISK_USAGE=$(/usr/bin/du -k -d 0 "$FILEPATH" | /usr/bin/head -n 1 | /usr/bin/awk '{print $1}')
DU_SIZE=$(echo "$DISK_USAGE * 1024" | /usr/bin/bc -l)
SEDPATH=$(echo "$FILEPATH" | /usr/bin/awk '{gsub("/","\\/");print}')
LISTING=$(ls -RAlO@ "$FILEPATH" | /usr/bin/sed -e '/^$/d' -e '/^'"$SEDPATH"'/d' | /usr/bin/awk 'NF>2')
DATASIZE=$(echo "$LISTING" | /usr/bin/grep -v '^d' | /usr/bin/awk '{total += $6} END {printf "%.0f", total}')
echo "du: $DU_SIZE"
echo "data: $DATASIZE"

考えられる解決策:macOSとHFS +が問題です。いつものように!私はそれを「リンゴのコア腐敗」と呼ぶと思います。データサイズ全体を計算するスクリプトでduコマンドを再実行し、ls / stat出力のブロック数に基づいてディスク使用量を「手動で」計算するいくつかのコマンドを追加しました。ディスク使用量は実際には全体のデータサイズより大きかった。 FS圧縮(スパースファイルなど)があってはならないからです。今(突然!)duコマンドも正しい結果を出力します。推測しかできないのは、おそらくHFS +が最初に計算する時間がなかったからです。したがって、duがシステムに「ディスク使用量が何であるか」と尋ねたとき、部分的な結果のみが得られました。

FILEPATH="/usr/local/bin"                                                                                                     [21:38:27]
SEDPATH=$(echo "$FILEPATH" | /usr/bin/awk '{gsub("/","\\/");print}')
MPOINT=$(/bin/df "$FILEPATH" | /usr/bin/tail -1 | /usr/bin/awk '{for(i=9; i<=NF; i++) printf "%s",$i (i==NF?ORS:OFS)}')
CLUSTERSIZE=$(/usr/sbin/diskutil info "$MPOINT" | /usr/bin/awk '/Device Block Size/{print $4}')
TOTAL_LIST=$(ls -ReAlOs@ "$FILEPATH")
SWITCH_LIST=$(echo "$TOTAL_LIST" | /usr/bin/sed -e '/^$/d' -e '/^'"$SEDPATH"'/d' | /usr/bin/awk 'NF>=11' | /usr/bin/awk '{print $2,$7,$1}')
BLOCKSONDISK=$(echo "$SWITCH_LIST" | /usr/bin/grep -v '^d' | /usr/bin/awk '{total += $3} END {printf "%.0f", total}')
SIZEONDISK=$(echo "$BLOCKSONDISK * $CLUSTERSIZE" | /usr/bin/bc -l)
echo "od: $SIZEONDISK B"
DISK_USAGE=$(/usr/bin/du -k -d 0 "$FILEPATH" | /usr/bin/head -n 1 | /usr/bin/awk '{print $1}')
DU_SIZE=$(echo "$DISK_USAGE * 1024" | /usr/bin/bc -l)
echo "du: $DU_SIZE B"
DATASIZE=$(echo "$SWITCH_LIST" | /usr/bin/grep -v '^d' | /usr/bin/awk '{total += $2} END {printf "%.0f", total}')
echo "ds: $DATASIZE B"

出力:

physical (stat): 36343808 B
physical   (du): 36343808 B
datasize (stat): 32584254 B

ベストアンサー1

おすすめ記事