Jak uzyskać rozmiar katalogu w wierszu poleceń?

1065

Próbowałem uzyskać rozmiar katalogu (zawierającego katalogi i podkatalogi) za pomocą lspolecenia z opcją l. Wygląda na to, że działa dla plików ( ls -l file name), ale jeśli spróbuję uzyskać rozmiar katalogu (na przykład ls -l /home), otrzymam tylko 4096 bajtów, chociaż w sumie jest on znacznie większy.

Abdul Al Hazred
źródło
18
1) Ściśle mówiąc, nie możesz. Linux ma katalogi, a nie foldery. 2) Istnieje różnica między rozmiarem katalogu (który jest specjalnym plikiem zawierającym i-węzły wskazujące na inne pliki), a rozmiarem zawartości tego katalogu. Jak zauważyli inni, polecenie du zapewnia to drugie, czego wydaje się, że chcesz.
jamesqf
11
ponieważ wydaje się, że jesteś nowy, wskażę tylko przydatną -hopcję, którą możesz dodać do -lopcji (tj. ls -lh), aby uzyskać rozmiary plików do wydrukowania w przyjaznej dla ludzi notacji, takiej jak 1,1M zamiast 1130301. „h ”w du -hspoleceniu, które @sam podał jako odpowiedź na pytanie dotyczące katalogów, oznacza również„ czytelny dla człowieka ”, a także df -hpokazuje, w którym czytelnych dla człowieka ilości używanego i wolnego miejsca na dysku.
msouth

Odpowiedzi:

1489

du -sh file_path

Wyjaśnienie

  • duKomenda ( d isc u sage) szacuje użycie miejsca na ścieżkę_pliku
  • Dostępne -shsą następujące opcje (od man du):

      -s, --summarize
             display only a total for each argument
    
      -h, --human-readable
             print sizes in human readable format (e.g., 1K 234M 2G)
    

    Aby sprawdzić więcej niż jeden katalog i zobaczyć sumę, użyj du -sch:

      -c, --total
             produce a grand total
    
sam
źródło
44
... chyba że masz
twarde linki
15
Jest to rodzaj odpowiedzi, którą uwielbiam <3 Jest ona streszczona i stanowi wprowadzenie do polecenia, dua także dajesz drogę do szukania dalszych szczegółów man du...
Wskazówka dla twórców uniksowych: Następnym razem po prostu wykonaj najpierw polecenie „diskusage”, a może nawet „użycie dysku” ... następnie skrót ...;)
jave.web
Działa to bardzo dobrze, find np. Do zliczania ilości miejsca w określonych podkatalogach na bieżącej ścieżce: $ find . -type d -name "node_modules" -prune -exec du -sh {} \;
Alex Glukhovtsev
321

Wystarczy użyć dupolecenia:

du -sh -- *

da ci łączne wykorzystanie dysku przez wszystkie nie ukryte katalogi, pliki itp. w bieżącym katalogu w formacie czytelnym dla człowieka.

Możesz użyć dfpolecenia, aby poznać wolne miejsce w systemie plików zawierającym katalog:

df -h .
Pacyfista
źródło
4
du -sh *zaczyna zgłaszać błędy „nieznana opcja”, jeśli którykolwiek z plików w tym katalogu zaczyna się od myślnika. Bezpieczniej zrobićdu -sh -- *
MPpl
1
du -sh *nie pokazuje użycia pamięci przez ukryte foldery
Prashant Prabhakar Singh
4
du -sh -- * .*dołączyć pliki dot. Przydatne jest na przykład włączenie możliwie dużego .gitkatalogu. Alternatywnie w zsh możesz setopt globdotsdomyślnie globować pliki dot.
cbarrick
1
Czego --zrobić? Wiem, że dotyczy to wbudowanych powłok do argumentów opcji końcowych, ale dunie jest wbudowane i nie widzę tego użycia udokumentowanego dla du: linux.die.net/man/1/du
flow2k
Czasami będziesz chciał dodać -b( --apparent-size)
elig
196

dujest twoim przyjacielem. Jeśli chcesz tylko poznać całkowity rozmiar katalogu, wskocz do niego i uruchom:

du -hs

Jeśli chcesz również wiedzieć, które podfoldery zajmują tyle miejsca na dysku ?! Możesz rozszerzyć to polecenie na:

du -h --max-depth=1 | sort -hr

co da ci rozmiar wszystkich podfolderów (poziom 1). Dane wyjściowe zostaną posortowane (największy folder na górze).

Chrispie
źródło
Wydaje się, że w niektórych (być może starszych?) Wersjach systemu Linux, sort nie ma przełącznika h, a zatem następne najlepsze polecenie, jakie mogłem znaleźć, to: du -c --max-depth = 1 | sort -rn
richhallstoke 13.07.16
@richhallstoke, jeśli korzystasz ncduz plików, domyślnie są sortowane według malejącego rozmiaru.
Armfoot
3
+1 za „| sort -hr”
afranques
67

dumoże być skomplikowane w użyciu, ponieważ pozornie musisz przekazać 100 argumentów, aby uzyskać przyzwoitą wydajność. Ustalenie rozmiaru ukrytych folderów jest jeszcze trudniejsze.

Uczyń swoje życie łatwym i łatwym w użyciuncdu .

ncdu

Otrzymujesz podsumowania folderów, które można łatwo przeglądać.

Teque5
źródło
9
To powinna być poprawna odpowiedź, przynajmniej dla tych, którzy mogą instalować oprogramowanie w systemie. Niestety nie sądzę, że większość ludzi przewinie wystarczająco daleko, aby to zobaczyć.
DavidR
@ RickyNotaro-Garcia Nope, to ignoruje ukryte obiekty i zawiesza się w dużych katalogach. Możliwe, że istnieje dobre rozwiązanie z tuzinem rur, ale po co marnować swoje życie.
Teque5
@ RickyNotaro-Garcia Przeczytaj cały mój komentarz: twoja próba ignoruje ukryte obiekty i zawiesza się na dużych katalogach.
Teque5
2
ncdujest świetne, zawsze szukam tego polecenia, gdy zapomnę. Jest szybki, łatwy w nawigacji i pomaga łatwo znajdować duże foldery. Do Twojej wiadomości, jest również dostępny dla systemu macOS i prawdopodobnie dla wszystkich komputerów z systemem Linux.
Lukas,
... i możesz usunąć foldery bezpośrednio ncdu, naciskając dklawisz
ccpizza
32

Inni wspominali du, ale chciałbym też wspomnieć o Ncdu - która jest wersją ncurses dui zapewnia interaktywność: Możesz bezpośrednio odkryć hierarchię katalogów i zobaczyć rozmiary podkatalogów.

Tblue
źródło
26

duKomenda pokazuje użycie dysku pliku.

-hWariant przedstawiono wyniki w postaci czytelnej dla człowieka (na przykład, 4k, 5M, 3G).

du -h (file name)
jackotonye
źródło
22

Wszystkie powyższe przykłady podadzą rozmiar danych na dysku (tj. Ilość miejsca na dysku, z którego korzysta dany plik, który jest zwykle większy niż rzeczywisty rozmiar pliku). Istnieją sytuacje, w których nie dają dokładnego raportu, jeśli dane nie są faktycznie przechowywane na tym konkretnym dysku i istnieją tylko odwołania do i-węzłów.

W twoim przykładzie użyłeś ls -l na pojedynczym pliku, który zwróci rzeczywisty rozmiar pliku, a NIE jego rozmiar na dysku.

Jeśli chcesz poznać rzeczywiste rozmiary plików, dodaj opcję -b do du.

du -csbh .
Andy Foster
źródło
Tak. Używam sdfs, który kompresuje i deduplikuje pliki, więc nie mogłem zrozumieć, dlaczego zgłasza tak niskie liczby. Rzeczywisty rozmiar plików z ls można znaleźć, używając: du -b
Ryan Shillington
15

osobiście uważam, że najlepiej, jeśli nie chcesz używać ncdu

# du -sh ./*
ConnerMan
źródło
14
df -h .; du -sh -- * | sort -hr

To pokazuje, ile miejsca pozostało na bieżącym dysku, a następnie informuje, ile zajmuje każdy plik / katalog. na przykład,

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       206G  167G   29G  86% /
115M    node_modules
2.1M    examples
68K     src
4.0K    webpack.config.js
4.0K    README.md
4.0K    package.json
mpen
źródło
FYI, wydaje się raportować rozmiar na dysku. tzn. prawdopodobnie zostanie uzupełniony do najbliższego 4KB.
mpen
9

Używam tego polecenia jako root :

sudo ls -1d */ | sudo xargs -I{} du {} -sh && sudo du -sh
Eduard Florinescu
źródło
9

znajdź rekursywnie wszystkie pliki w bieżącym katalogu i podsumuj ich rozmiar:

find -type f -print0 | xargs -0 stat --print='%s\n' | awk '{total+=$1} END {print total}'
Leon Chang
źródło
Użyłbym -not -type ddo sumowania nie tylko rozmiarów zwykłych plików ( -type f), ale także rozmiarów dowiązań symbolicznych i tak dalej.
anton_rh
Jest to świetne, ponieważ nie dostajesz narzutu wymaganego do przechowywania plików, a jedynie rozmiar samych plików.
bballdave025
9

Oto funkcja dla twoich .bash_aliases

# du with mount exclude and sort
function dusort () {
    DIR=$(echo $1 | sed 's#\/$##')
    du -scxh $(mount | awk '{print $3}' | sort | uniq \
     | sed 's#/# --  exclude=/#') $DIR/* | sort -h
}

próbka wyjściowa:

$ dusort /
...
0       /mnt  
0       /sbin
0       /srv
4,0K    /tmp
728K    /home
23M     /etc
169M    /boot  
528M    /root
1,4G    /usr
3,3G    /var
4,3G    /opt
9,6G    total

dla podkatalogów:

$ dusort .
$ dusort /var/log/
feldversuch
źródło
7

Jeszcze jeden wariant:

du -h --max-dep=1
0x8BADF00D
źródło
6

Zauważ, że dudrukuje miejsce, które katalog zajmuje na nośniku, które jest zwykle większe niż całkowity rozmiar wszystkich plików w katalogu, ponieważ dubierze pod uwagę rozmiar wszystkich informacji pomocniczych przechowywanych na nośniku w celu uporządkowania katalogu zgodnie w formacie systemu plików.

Jeśli system plików jest kompresowalny, dumoże wygenerować jeszcze mniejszą liczbę niż całkowity rozmiar wszystkich plików, ponieważ pliki mogą być wewnętrznie skompresowane przez system plików, a zatem zajmują mniej miejsca na nośniku niż tylko nieskompresowane informacje, które zawierają. To samo, jeśli istnieją rzadkie pliki.

jeśli w katalogu znajdują się twarde łącza, dumoże również wydrukować mniejszą wartość, ponieważ kilka różnych plików w katalogu odwołuje się do tych samych danych na nośniku.

Aby uzyskać bezpośredni całkowity rozmiar wszystkich plików w katalogu, można użyć następującego jednowierszowego wyrażenia powłoki (przy założeniu systemu GNU):

find . ! -type d -print0 | xargs -r0 stat -c %s | paste -sd+ - | bc

lub nawet krócej:

find . ! -type d -printf '%s\n' | paste -sd+ - | bc

Po prostu sumuje rozmiary wszystkich plików innych niż katalogowe w katalogu (i jego podkatalogach rekurencyjnie) jeden po drugim. Zauważ, że w przypadku dowiązań symbolicznych podaje rozmiar dowiązania symbolicznego (nie pliku, na który wskazuje dowiązanie symboliczne).

anton_rh
źródło
5

Możesz użyć

du -sh directory/

i

du -sh filename

znać miejsce zajmowane przez folder lub plik.

df -h

pokaże użycie dysku w formacie czytelnym dla człowieka - h to robi.

Istnieje również program o nazwie GUI Disk Usage Analyzer.

arupgsh
źródło
5

Oto skrypt POSIX, który będzie działał z:

  • Plik
  • Akta
  • Katalog
  • Katalogi
#!/bin/sh
ls -ARgo "$@" | awk '{q += $3} END {print q}'

Źródło

Steven Penny
źródło