macOS: possível que du possa reportar o tamanho errado para uso do disco?

1

Eu tenho um script que estou testando em alguns locais em meus volumes, e parte dele é o cálculo do uso de disco & tamanho total dos dados. Estava tudo bem, e os valores que eu estava obtendo sempre correspondiam ao que o próprio MacOS estava relatando na saída mdls e nas informações do Finder.

No entanto, ao executar o script em /usr/local/Cellar - o diretório de instalação do Homebrew - a saída era estranha. O uso do disco estava em 3,234,828,288 bytes, enquanto o tamanho dos dados era realmente maior, ou seja, em 3,254,656,870 bytes. Mesmo resultado ao executar o script como root ou com o GNU-du. O uso do disco não deve ser sempre maior que o tamanho dos dados? (A menos que você esteja usando a compactação HFS +, é claro, mas esse não parece ser o caso aqui: não há sinalizadores de arquivo "compactados" na saída ls .)

Aqui estão as partes relevantes do script, primeiro uso do disco e, em seguida, total de dados:

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"

Solução provável: macOS & O HFS + é o problema, como sempre ! Eles chamam de "Apple Core Rot", eu acredito. Eu executei o comando du novamente, junto com o script para calcular o tamanho total dos dados, e também adicionei alguns comandos para calcular o uso do disco "manualmente" da contagem de blocos na saída ls / stat, e eis que o uso do disco calculado é de fato maior que o tamanho total de dados, como deveria ser sem compressão de FS (arquivos esparsos etc.) e agora (de repente!) o du comando também cospe o resultado correto. Por que só posso adivinhar, mas é provavelmente porque HFS + não tinha chegado a calculá-lo em primeiro lugar, então quando du perguntou ao sistema "qual é o uso do disco", ele só obteve um resultado parcial.

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"

Saída:

physical (stat): 36343808 B
physical   (du): 36343808 B
datasize (stat): 32584254 B
    
por JayB 25.03.2017 / 01:41

0 respostas