Różnica w obliczeniach wielkości katalogu

9

Potrzebuję uzyskać rozmiar katalogu w terminalu do celów podpisywania. Używam następującego polecenia:

du -s /path/to/dir

Mnożę wynik przez tradycyjny rozmiar bloku UNIX (512 bajtów) i otrzymuję rzeczywisty rozmiar katalogu w bajtach. Jednak okno dialogowe „Uzyskaj informacje” Findera pokazuje rozmiar nieco mniejszy niż rozmiar obliczony za pomocą polecenia terminalu. I wygląda na to, że można go odtworzyć w dowolnym folderze / pakiecie. czego mi brakuje?

Eimantas
źródło

Odpowiedzi:

11

Zwykle dupokazuje informacje o użyciu dysku (stąd pochodzi jego nazwa). Weź pod uwagę, że

disk usage != sum of file sizes

Ponieważ każdy plik zajmuje pewną liczbę bloków w systemie plików (patrz man mkfs.ext2na przykład). Oznacza to, że tylko w bardzo rzadkiej sytuacji użycie pliku na dysku jest równe jego rzeczywistemu rozmiarowi - w tym celu rozmiar musi być dokładnie wielokrotnością rozmiaru bloku.

Pomyśl o blokach systemu plików jak o polach zawierających części plików - każdy z nich może zawierać tylko jeden plik.

W przypadku wersji GNU dusprawdź --apparent-sizeopcję.


Jeszcze bardziej interesująca sytuacja może mieć miejsce, gdy w systemie plików znajdują się rzadkie pliki !

rozcietrzewiacz
źródło
Nie ma takiej opcji (korzystam z systemu OS X, a nie Linux). Prawdopodobnie trzeba o tym wspomnieć w pytaniu, ponieważ tag jest niewystarczający.)
Eimantas
Ach, racja ... Spójrz na stronę podręcznika i spróbuj znaleźć odniesienia do actuallub apparent. (Zobacz także moje zaktualizowane wyjaśnienie).
rozcietrzewiacz
2
Prawidłowe, z wyjątkiem nierówności. Rozmiary plików mogą czasami być większe niż faktyczne miejsce na dysku potrzebne do ich przechowywania. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez
@ StéphaneGimenez Wow ... dzięki, że mi powiedziałeś!
rozcietrzewiacz
2

O systemie Mac OS X i Finderze (w Snow Leopard, wersja 10.6.8) zauważyłem, co następuje.

  • Otrzymuję liczbę bajtów dla „ilościowych” liczb Findera ścieżki (pliku lub folderu) z kodem (w bash(1)) poniżej.
  • Okna i okienko „Informacje” Findera pokazuje liczby „skwantyfikowane” (np. Kilo w KB) w liczbach dziesiętnych (podstawa 10, 1000) w przeciwieństwie do bajtów binarnych (podstawa 2, 1024), więc „określam” dzieląc przez 1000 i zwiększenie prefiksu „kwantyfikatora” (wielkości) i wykonanie nieparzystego zaokrąglenia „poza kluczem”. (Mój pełny kod jest pełen skomentowanego kodu programistycznego i jest podzielony na kilka plików (i języków), więc trudno je udostępnić.)
    Jak dotąd widziałem, że moje „skwantyfikowane” liczby są takie same, jak „skwantyfikowane” liczby w Finderze .
  • Ponadto wraz z kodem chcę powiedzieć, że nie mam (i nigdy nie miałem) zmiennej środowiskowej BLOCKSIZEw mojej powłoce, ale przetestowałem (teraz trochę) obie wersje i wartości domyślne dla $BLOCKSIZEtych samych wartości.

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • Nieoznaczony numer, którego nie udało mi się dopasować.
    Jedyne, co mogę powiedzieć, to to, że zbliżam się tylko przez zliczanie plików (tym samym wykluczając katalog ~ 'system plików meta indeks / nagłówek' ~ dane) i że najbliższe mi jest to, co następuje.

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • Wydaje się, że ani (xnu) du(1), ani (gnu) gdu(1) nie uwzględniają atrybutów rozszerzonych ( xattr)

A potem muszę tylko wykasować: „Biegnij ścieżką i zrób matematykę”.
Tym razem pokój i dobranoc.

vike
źródło
1

W moim systemie Ubuntu, przy użyciu ext4, du -b filepodaje rozmiar w bajtach rzeczywistego pliku i du -b dirpodaje rozmiar w bajtach pliku (plików) + narzut katalogu, Narzut jest w moim przypadku wielokrotnością 4096 bajtów ..

Obciążenie to rośnie wraz ze wzrostem liczby plików.
Uwaga: nawet jeśli pliki zostaną usunięte, narzut katalogu pozostanie na wyższym poziomie, na którym znajdował się przed usunięciem plików.

Nie próbowałem ponownie uruchamiać się, aby zobaczyć, czy przywraca się, ale w obu przypadkach oznacza to, że rozmiar katalogu różni się w zależności od okoliczności historycznych.

Tallying każdego rozmiaru pliku może być najlepszą opcją dla dokładnej wartości całkowitych rozmiarów plików .

Poniższy skrypt sumuje wszystkie rozmiary plików (w bajtach) ..

W przypadku OS X, jeśli nie masz -bopcji „du”, możesz statzamiast tego użyć (jeśli masz :) ... Skomentowana linia pokazuje statalternatywę dla Ubuntu du -b;

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total
Peter.O
źródło
2
OSX nie madu -b i jest innystat . Twój skrypt nie jest przenośny poza Linuksem.
Gilles „SO- przestań być zły”
Z MacPorts na OS X można zainstalować, coreutilsaby uzyskać wersję GNU duas gdu. Więc nie jest do końca przenośny, ale może być użyteczny dla osób w OS X, aby uzyskać wersje GNU kilku podstawowych narzędzi.
drfrogsplat
1

Zsumuj wszystkie pliki w katalogu:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'

chrześcijanin
źródło
find: unrecognized: -printf. Obraz alpejski
gadelat