macOS: возможно, что du может сообщить о неправильном размере для использования диска?

У меня есть сценарий, который я тестирую в некоторых местах на своих томах, а частью этого является расчет использования диска и общий размер данных. Все было в порядке, и значения, которые я получал всегда, были сопоставлены с тем, что сам macOS сообщал в выводе mdls и в Finder Info.

Однако при запуске скрипта на /usr/local/Cellar – каталоге установки Homebrew – выход был странным. Использование диска составляло 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 + – проблема, как всегда ! Я считаю, что это называют «Apple Core Rot». Я снова запустил команду du, вместе со сценарием, чтобы вычислить общий размер данных, а также добавил некоторые команды для вычисления использования диска «вручную» из числа блоков в выводе ls / stat и lo и behold, рассчитанного использования диска на самом деле больше общего размера данных, так как это должно быть без сжатия FS (разреженные файлы и т. д.), и теперь (внезапно!) команда du также выплевывает правильный результат. Почему я могу только догадываться, но, вероятно, из-за того, что HFS + не собирался его вычислять в первую очередь, поэтому, когда компания спросила систему «что такое использование диска», она получила лишь частичный результат.

 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 

Linux и Unix - лучшая ОС в мире.