Jak uzyskać rzeczywisty rozmiar katalogu przy użyciu standardowych narzędzi UNIX / Linux?
Alternatywne pytanie: Jak uzyskać du, aby pokazał mi rzeczywisty rozmiar katalogu (a nie użycie dysku)?
Ponieważ ludzie wydają się mieć różne definicje terminu „rozmiar”: Moja definicja „rozmiaru katalogu” jest sumą wszystkich zwykłych plików w tym katalogu.
NIE dbam o rozmiar i-węzła katalogu lub cokolwiek innego (rozmiar bloku * rozmiar bloku), które pliki zajmują w danym systemie plików. Katalog z 3 plikami, po 1 bajcie, ma rozmiar katalogu 3 bajtów (według mojej definicji).
Obliczanie rozmiaru katalogu za pomocą du wydaje się niewiarygodne.
Na przykład mkdir foo && du -b foo
zgłasza „4096 foo”, 4096 bajtów zamiast 0 bajtów. Przy bardzo dużych katalogach rozmiar katalogu zgłaszany przez du -hs
może być wyłączony o 100 GB (!) I więcej (skompresowany system plików).
Więc czego (narzędzie / opcja) należy użyć, aby uzyskać rzeczywisty rozmiar katalogu?
xfs
przypadek?Odpowiedzi:
Oto skrypt wyświetlający rozmiar katalogu czytelny dla człowieka przy użyciu standardowych narzędzi uniksowych (POSIX).
na przykład:
źródło
ls
inwokacji tutaj:-q
. Bez tej opcji skrypt ulegnie awarii, jeśli jakaś nazwa pliku zawiera znaki nowej linii. Pisanie naprawdę niezawodnych skryptów powłoki jest zbyt trudne…Niektóre wersje
du
obsługują argument,--apparent-size
aby pokazać pozorny rozmiar zamiast użycia dysku. Zatem twoim poleceniem byłoby:Ze stron podręcznika dla du zawartych w Ubuntu 12.04 LTS:
źródło
Po prostu alternatywa przy użyciu
ls
:ls -nR
:-n
polub-l
, ale wyświetl numeryczne identyfikatory UID i GID oraz-R
rekursywnie wyświetl podkatalogi.grep -v:
Odwróć sens dopasowania, aby wybrać niepasujące linie. (-v jest określone przez POSIX.).'^ d'
wykluczy katalogi.Polecenie Ls: http://linux.about.com/od/commands/l/blcmdl1_ls.htm
Man Grep: http://linux.die.net/man/1/grep
EDYCJA :
Edytowane jako sugestia @ Sergey Vlasov.
źródło
-n
opcjils
zamiast zamiast-l
(pokaż numery UID / GID zamiast nazw) jest bezpieczniejsze, ponieważ nazwy użytkowników i grup mogą zawierać spacje (np. Jeśliwinbind
lubsssd
służy do przyłączenia systemu do domeny Windows, możesz uzyskać nazwy grup takie jakdomain users
) . Powinno być także szybsze, ponieważ nie trzeba wyszukiwać nazw użytkowników i grup.Zakładając, że masz
du
z GNU coreutils, to polecenie powinno obliczyć całkowity pozorny rozmiar dowolnej liczby zwykłych plików w katalogu bez żadnych arbitralnych ograniczeń liczby plików:Dodaj
-l
opcję,du
jeśli w środku są jakieś pliki dowiązane i chcesz policzyć każde dowiązanie osobno (domyślniedu
zlicza wiele dowiązań tylko raz).Najważniejszą różnicą w stosunku do zwykłego
du -sb
jest to, że rekurencyjnedu
również liczą rozmiary katalogów, które są zgłaszane w różny sposób przez różne systemy plików; Aby tego uniknąć,find
polecenie służy do przekazywania tylko zwykłych plikówdu
. Kolejna różnica polega na tym, że dowiązania symboliczne są ignorowane (jeśli należy je policzyć,find
należy dostosować polecenie).Polecenie to również zużywają więcej pamięci niż zwykły
du -sb
, ponieważ używając--files0-from=FILE
czynidu
urządzenie sklepu i numer-węzła wszystkich przetwarzanych plików, w przeciwieństwie do standardowego zachowania pamiętając tylko pliki z więcej niż jednego dysku link. (Nie stanowi to problemu, jeśli-l
opcja jest używana do liczenia linków twardych wiele razy, ponieważ jedynym powodem przechowywania numerów urządzeń i i-węzłów jest pomijanie plików, które zostały już przetworzone).Jeśli chcesz uzyskać czytelną dla człowieka reprezentację całkowitego rozmiaru, po prostu dodaj
-h
opcję (działa to, ponieważdu
wywoływany jest tylko raz i oblicza sam całkowity rozmiar, w przeciwieństwie do niektórych innych sugerowanych odpowiedzi):lub (jeśli martwisz się, że niektóre efekty
-b
zostaną następnie zastąpione-h
)źródło
-b
prawdopodobnie można go zastąpić-A -B 1
, nie ma odpowiednika--files0-from=-
, a użyciexargs
będzie wymagać pewnych obejść w przypadku, gdy lista plików jest większa niżARG_MAX
(i jakieś zewnętrzne rozwiązanie dla wyjścia czytelnego dla człowieka).Jeśli wszystko, czego potrzebujesz, to rozmiar plików, z wyłączeniem miejsca zajmowanego przez katalogi, możesz zrobić coś takiego
@SergeyVlasov wskazał, że to się nie powiedzie, jeśli masz więcej plików niż
argmax
. Aby tego uniknąć, możesz użyć czegoś takiego:źródło
xargs
będą wywoływanedu
wiele razy, a każde wywołanie wydrukuje sumę całkowitą tylko ze swojej strony pełnej listy plików, a następnietail
pokaże całkowity rozmiar ostatniej części.