Całkowity rozmiar zawartości wszystkich plików w katalogu [zamknięty]

103

Kiedy używam lslub du, uzyskuję ilość miejsca na dysku zajmowaną przez każdy plik.

Potrzebuję sumy wszystkich danych w plikach i podkatalogach, które otrzymam, gdybym otworzył każdy plik i policzył bajty. Dodatkowe punkty, jeśli mogę to uzyskać bez otwierania każdego pliku i liczenia.

Arthur Ulfeldt
źródło
1
lsw rzeczywistości pokazuje liczbę bajtów w każdym pliku, a nie ilość miejsca na dysku. Czy to wystarcza dla Twoich potrzeb?
Greg Hewgill
3
Zauważ, że dunie można go użyć, aby odpowiedzieć na to pytanie. Pokazuje ilość miejsca na dysku zajmowaną przez katalog na dysku (dane plików plus rozmiar pomocniczych metainformacji systemu plików). Wynik dumoże być nawet mniejszy niż całkowity rozmiar wszystkich plików. Może się tak zdarzyć, jeśli system plików może przechowywać dane skompresowane na dysku lub jeśli używane są twarde łącza. Prawidłowe odpowiedzi są oparte na lsi find. Zobacz odpowiedzi Nelsona i bytepana tutaj lub tę odpowiedź: unix.stackexchange.com/a/471061/152606
anton_rh

Odpowiedzi:

108

Jeśli chcesz mieć `` pozorny rozmiar '' (czyli liczbę bajtów w każdym pliku), a nie rozmiar zajmowany przez pliki na dysku, użyj opcji -blub --bytes(jeśli masz system Linux z jądrem GNU ):

% du -sbh <directory>
Arkady
źródło
1
działa na moich nowszych pudełkach z czerwonym kapeluszem, niestety nie na moim osadzonym pudełku Dev.
Arthur Ulfeldt
3
Czy istnieje łatwy sposób pokazania „pozornego rozmiaru” w formacie czytelnym dla człowieka? Podczas używania du -shb(jak sugeruje ta odpowiedź), -bustawienie wydaje się zastępować -hustawienie.
Mathias Bynens
6
@MathiasBynens Odwróć kolejność flag (np. Du -sbh <dir>). Pracuje dla mnie.
Luis E.
2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi
2
@Arkady Wypróbowałem Twoje rozwiązanie na CentOS i Ubuntu i jest tam mały błąd. Chcesz "du -sbh". Flaga „-h” musi być ostatnia.
theJollySin
46

Zastosowanie du -sb:

du -sb DIR

Opcjonalnie dodaj hopcję bardziej przyjaznych dla użytkownika wyników:

du -sbh DIR
obrabować
źródło
4
-b wydaje się być nielegalną opcją dla MacOS du
lynxoid
3
@lynxoid: Można zainstalować wersję GNU z wywaru: brew install coreutils. Będzie dostępny jako polecenie gdu.
neu242
1
Nie działa. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. Na pewno nie jest to całkowity rozmiar zawartości, ale rozmiar katalogu, który zajmuje na dysku.
anton_rh
24

cd do katalogu, a następnie:

du -sh

ftw!

Pierwotnie pisałem o tym tutaj: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/

AO_
źródło
1
To jest proste i działa! Dzięki. Czasami lubię dodać -Lopcję, więc dupodążam za linkami symbolicznymi.
conradkleinespel
2
działa dla mnie (na OS X)
sam boosalis
2
To jest proste i nie działa. Wyświetla miejsce zajmowane przez katalog na dysku, a nie całkowity rozmiar zawartości, który można obliczyć, otwierając każdy plik i zliczając bajty.
anton_rh
17

Tylko alternatywa:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' wykluczy katalogi.

Barun
źródło
4
Idealnie, dodaj także parametr -a, aby uzyskać „ukryte pliki” (wszystko, co zaczyna się od
kropki
Wyizolowany do określonego typu pliku (w tym przypadku PNG) i wyrażony w MB dla większej czytelności: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice
To jest poprawna odpowiedź. W przeciwieństwie do dutego rozwiązania tak naprawdę liczy całkowity rozmiar wszystkich danych w plikach tak, jakby były otwierane jeden po drugim, a ich bajty były liczone. Ale tak, dodanie -Aparametru jest wymagane, aby policzyć również pliki ukryte.
anton_rh
13

Format „% s” programu stat podaje rzeczywistą liczbę bajtów w pliku.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

Możesz zastąpić swoją ulubioną metodę sumowania liczb .

Nelson
źródło
4
Najlepiej użyj "find. -Type f -print0 | xargs -0 ...", aby uniknąć problemów z niektórymi nazwami plików (zawierającymi spacje itp.).
hlovdal
1
tak, słuszna uwaga. gdyby nie było w bsd 4.2, nie pamiętam, żeby go używać :-(
Nelson
3
find -print0i xargs -0są potrzebne w przypadku nazw plików ze spacjami. OS X chce stat -f %z.
Kornel
1
(Zauważ, że stat działa z rzadkimi plikami, zgłaszając duży nominalny rozmiar pliku, a nie mniejsze bloki używane na dysku, takie jak duraporty.)
Nelson
1
W przeciwieństwie do wielu innych odpowiedzi tutaj, które błędnie wykorzystują dunarzędzie, ta odpowiedź jest poprawna. Odpowiedź jest bardzo podobna do odpowiedzi tutaj: unix.stackexchange.com/a/471061/152606 . Ale ! -type dzamiast tego -type fużyłbym również do liczenia dowiązań symbolicznych (rozmiar samego dowiązania symbolicznego (zwykle kilka bajtów), a nie rozmiar pliku, na który wskazuje).
anton_rh
3

Jeśli używasz "du" busyboxa w systemie emebedded, nie możesz uzyskać dokładnych bajtów z du, tylko KB, które możesz uzyskać.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)
Sam Liao
źródło
3

Podczas tworzenia folderu wiele systemów plików Linuksa przydziela 4096 bajtów na przechowywanie niektórych metadanych dotyczących samego katalogu. Ta przestrzeń jest zwiększana o wielokrotność 4096 bajtów w miarę rozrastania się katalogu.

Komenda du (z opcją -b lub bez niej) liczy to miejsce , jak widać wpisując:

mkdir test && du -b test

otrzymasz wynik 4096 bajtów dla pustego katalogu. Tak więc, jeśli umieścisz 2 pliki po 10000 bajtów w katalogu, całkowita ilość podana przez du -sb wyniesie 24096 bajtów.

Jeśli uważnie przeczytasz pytanie, nie o to chodzi. Pytający zapytał:

suma wszystkich danych w plikach i podkatalogach, które dostałbym, gdybym otworzył każdy plik i policzył bajty

w powyższym przykładzie powinno to być 20000 bajtów, a nie 24096.

Tak więc poprawna odpowiedź IMHO może być połączeniem odpowiedzi Nelsona i sugestii hlovdal, aby obsłużyć nazwy plików zawierające spacje:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'
bytepan
źródło
2

Istnieją co najmniej trzy sposoby uzyskania „sumy wszystkich danych w plikach i podkatalogach” w bajtach, które działają zarówno w systemie Linux / Unix, jak i Git Bash dla Windows, wymienione poniżej w kolejności od najszybszego do średnio najwolniejszego. Dla Twojej informacji zostały wykonane w katalogu głównym dość głębokiego systemu plików ( docrootw instalacji Magento 2 Enterprise zawierającej 71 158 plików w 30 027 katalogach).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


Te dwa również działają, ale opierają się na poleceniach, które nie istnieją w Git Bash dla Windows:

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


Jeśli chcesz tylko sumę dla bieżącego katalogu, dodaj -maxdepth 1do find.


Zwróć uwagę, że niektóre z sugerowanych rozwiązań nie zwracają dokładnych wyników, więc zamiast tego trzymałbym się powyższych rozwiązań.

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133
thdoan
źródło
1
Jeśli chodzi o Git Bash for Windows, - w przypadku Cygwin dcjest częścią bcpakietu, więc abydc go uzyskać , należy go zainstalować bc.
ruvim
1

W przypadku Win32 DOS możesz:

c:> dir / sc: \ katalog \ chcesz \

a przedostatnia linia powie, ile bajtów zajmują pliki.

Wiem, że to czyta wszystkie pliki i katalogi, ale w niektórych sytuacjach działa szybciej.

Słońce
źródło
1

dujest przydatne, ale findjest przydatne w przypadku, gdy chcesz obliczyć rozmiar tylko niektórych plików (na przykład używając filtru według rozszerzenia). Zauważ również, że findsami mogą wydrukować rozmiar każdego pliku w bajtach. Aby obliczyć całkowity rozmiar, możemy połączyć dcpolecenie w następujący sposób:

find . -type f -printf "%s + " | dc -e0 -f- -ep

Tutaj findgeneruje sekwencję poleceń dla dcpolubienia 123 + 456 + 11 +. Chociaż ukończony program powinien wyglądać jak 0 123 + 456 + 11 + p(pamiętaj o notacji postfiksowej).

Tak więc, aby otrzymać ukończony program, musimy umieścić go 0na stosie przed wykonaniem sekwencji ze standardowego wejścia, a po wykonaniu wypisać najwyższy numer ( ppolecenie na końcu). Osiągamy to poprzez dcopcje:

  1. -e0to tylko skrót do -e '0'tego, co stawia 0na stosie,
  2. -f-służy do odczytu i wykonywania poleceń ze stdin (wygenerowanego findtutaj),
  3. -epsłuży do wypisania wyniku ( -e 'p').

Aby wydrukować rozmiar w MiB, tak jak 284.06 MiBmożemy -e '2 k 1024 / 1024 / n [ MiB] p'zamiast tego użyć w punkcie 3 (większość spacji jest opcjonalna).

ruvim
źródło
1

To może pomóc:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

Powyższe polecenie zsumuje wszystkie pliki opuszczające rozmiar katalogów.

Ataul Haque
źródło
1
Zauważ, że to rozwiązanie jest bardzo podobne do odpowiedzi Baruna. Ale to rozwiązanie nie sumuje plików w podkatalogach.
ruvim
1
@ruvim, nie sumuje również ukrytych plików. Aby podsumować ukryte pliki, -Aopcję należy dodać do ls.
anton_rh
0

Posługiwać się:

$ du -ckx <DIR> | grep total | awk '{print $1}'

Gdzie <DIR> to katalog, który chcesz sprawdzić.

Opcja „-c” daje sumaryczne dane, które są wyodrębniane przy użyciu części polecenia „grep total”, a liczba w kilobajtach jest wyodrębniana za pomocą polecenia awk.

Jedynym zastrzeżeniem jest to, że jeśli masz podkatalog zawierający tekst „total”, zostanie on również wypluty.

Rob Jones
źródło