Używanie ls do wyświetlania katalogów i ich całkowitych rozmiarów


826

Czy lsw Unixie można używać do wyliczania całkowitego rozmiaru podkatalogu i całej jego zawartości, w przeciwieństwie do zwykłego 4K(zakładam, że) samego pliku katalogu?

total 12K
drwxrwxr-x  6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk

Po przeszukaniu stron podręcznika, wychodzę pusty.


4
zamiast tego chcesz użyć du -s
Guns

21
W poszukiwaniu kaczek:alias ducks='du -cksh * | sort -hr | head -n 15'
Sebi

Odpowiedzi:


1549

Wypróbuj coś takiego:

du -sh *

krótka wersja:

du --summarize --human-readable *

Wyjaśnienie:

du: D isk U sage

-s: Wyświetla podsumowanie dla każdego określonego pliku. (Odpowiednik -d 0)

-h: Wyjście „czytelne dla człowieka”. Stosowanie sufiksów jednostka: B YTE, K ibibyte (KiB) M ebibyte (MIB), G ibibyte (listwy), T ebibyte (TiB) i P ebibyte (PIB). (BASE2)


55
Również -c (produkuje sumę całkowitą) jest fajny.
meridius

50
du --max-depth 1 pokazuje tylko pliki / foldery o wielkości 1 głęboko w drzewie, bez bałaganu i łatwe do znalezienia dużych folderów w folderze.
CousinCocaine

12
jak dołączyć również ukryte pliki?
Zakaria Braksa

5
@Zak w zsh możesz użyć *(D)do dopasowania ukrytych ( d ot) plików wraz ze zwykłymi plikami. Korzystając z bash, możesz użyć, * .[!.]*aby dopasować oba.
Sebi

22
Aby uzyskać jasny obraz tego, gdzie idzie przestrzeń, du -sch * .[!.]* | sort -rhjest świetne (pokaż posortowane dane wyjściowe) Na Mac do: brew install coreutilsa następniedu -sch * .[!.]* | gsort -rh
Guig

319

du -sk * | sort -nposortuje foldery według rozmiaru. Pomocny, gdy chcesz wyczyścić przestrzeń ..


11
| tail -rNajpierw dodaj sortowanie według największego.
Phrogz

68
sort -rnsortuje rzeczy w odwrotnej kolejności numerycznej. sort -rn | head -n 10pokaże tylko kilka najlepszych, jeśli jest to interesujące.
AgileTillIDie

14
sort -rhbędzie działał ładnie, du -cksh *ponieważ sortuje jednostki czytelne dla ludzi.
Sebi

Niestety, @Sebi -h nie jest poprawnym parametrem sortowania na komputerze Mac
anon58192932,

@Sebi również -c nie jest konieczne, du -ksh | sort -rnjest takie samo jak du -cksh | sort -rn. Tak samo jak du -kshto samo du -cksh.
hello_there_andy

108
du -sh * | sort -h

Zostanie to wyświetlone w formacie czytelnym dla człowieka.


6
Więcej informacji sort -htutaj: gnu.org/software/coreutils/manual/... Jest to szczególnie tam do sortowania 103K, 102M, 1.1Gitd. To powinien być dostępny na wiele systemów w dzisiejszych czasach, ale nie wszystkie.
Evgeni Sergeev

duh -shm * | sortować -n?
std''OrgnlDave

10
działa świetnie, jeden mały dodatek du -sh * | sort -rh(-r do listy większych folderów jako pierwszy)
artm

Aby dołączyć ukryte pliki / katalogi; du -sh $(ls -A) | sort -h
jmd_dk

55

Aby wyświetlić listę największych katalogów z bieżącego katalogu w formacie czytelnym dla człowieka:

du -sh * | sort -hr

Lepszym sposobem na ograniczenie liczby wierszy może być

du -sh * | sort -hr | head -n10

Gdzie można zwiększyć sufiks -nflagi, aby ograniczyć liczbę wymienionych wierszy

Próba:

[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M    Vendor
1.1M    composer.phar
488K    phpcs.phar
488K    phpcbf.phar
72K doc
16K nbproject
8.0K    composer.lock
4.0K    README.md

Ułatwia to czytanie :)


27

Aby wyświetlić go w ls -lhformacie, użyj:

(du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }'

Wyjaśnienie kodu awk:

if($1 == "total") { // Set X when start of ls is detected
  X = 1 
} else if (!X) { // Until X is set, collect the sizes from `du`
  SIZES[$2] = $1
} else {
  // Replace the size on current current line (with alignment)
  sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); 
  print $0
}

Przykładowe dane wyjściowe:

drwxr-xr-x 2 root     root 4.0K    Feb 12 16:43 cgi-bin
drwxrws--- 6 root     www  20M     Feb 18 11:07 document_root
drwxr-xr-x 3 root     root 1.3M    Feb 18 00:18 icons
drwxrwsr-x 2 localusr www  8.0K    Dec 27 01:23 passwd

jakikolwiek sposób posortować to wyjście? Również dla każdego na --color=no
Macu

@ anon58192932 Możesz przesłać dane wyjściowe do sort --key=5,5hsortowania „jednostek czytelnych dla człowieka” z piątej kolumny
Sebi

zwraca sort: stray character in field spec: invalid field specification 5,5h ''. Czasami naprawdę nienawidzę macs = \
anon58192932

@ anon58192932 Możesz zadać pytanie dotyczące systemu Mac, jestem pewien, że jest ktoś, kto mógłby pomóc. To pytanie jest oznaczone jako GNU / linux
Sebi

2
czy istnieje sposób na zachowanie koloru przy użyciu tej odpowiedzi?
Pablo Canseco

20

Polecenie, które chcesz, to „du -sk” du = "użycie dysku"

Flaga -k podaje dane wyjściowe w kilobajtach zamiast domyślnych sektorów dysku (bloki 512-bajtowe).

Flaga -s wyświetla tylko rzeczy w katalogu najwyższego poziomu (domyślnie w bieżącym katalogu lub w katalogu określonym w wierszu poleceń). Dziwne, że du ma pod tym względem przeciwne zachowanie ls. Domyślnie du poda rekurencyjnie wykorzystanie miejsca na dysku w każdym podkatalogu. W przeciwieństwie do tego, ls da pliki listy tylko w określonym katalogu. (ls -R daje ci rekurencyjne zachowanie).


Próbowałem tego w katalogu głównym, nadal próbuje wyświetlić listę podkatalogów, co skutkuje dużą ilością wiadomości.
Nagev

14

Umieść tę deklarację funkcji powłoki w skryptach inicjujących powłokę:

function duls {
    paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}

Nazwałem to, dulsponieważ pokazuje dane wyjściowe zarówno dui ls(w tej kolejności):

$ duls
210M    drwxr-xr-x  21 kk  staff  714 Jun 15 09:32 .

$ duls *
 36K    -rw-r--r--   1 kk  staff    35147 Jun  9 16:03 COPYING
8.0K    -rw-r--r--   1 kk  staff     6962 Jun  9 16:03 INSTALL
 28K    -rw-r--r--   1 kk  staff    24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--   1 kk  staff       75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--   1 kk  staff    24473 Jun 10 13:26 Makefile.in
4.0K    -rw-r--r--   1 kk  staff     1689 Jun  9 16:03 README
120K    -rw-r--r--   1 kk  staff   121585 Jun 10 13:26 aclocal.m4
684K    drwxr-xr-x   7 kk  staff      238 Jun 10 13:26 autom4te.cache
128K    drwxr-xr-x   8 kk  staff      272 Jun  9 16:03 build
 60K    -rw-r--r--   1 kk  staff    60083 Jun 10 13:26 config.log
 36K    -rwxr-xr-x   1 kk  staff    34716 Jun 10 13:26 config.status
264K    -rwxr-xr-x   1 kk  staff   266637 Jun 10 13:26 configure
8.0K    -rw-r--r--   1 kk  staff     4280 Jun 10 13:25 configure.ac
7.0M    drwxr-xr-x   8 kk  staff      272 Jun 10 13:26 doc
2.3M    drwxr-xr-x  28 kk  staff      952 Jun 10 13:26 examples
6.2M    -rw-r--r--   1 kk  staff  6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
 11M    drwxr-xr-x  42 kk  staff     1428 Jun 10 13:26 src

$ duls doc
7.0M    drwxr-xr-x  8 kk  staff  272 Jun 10 13:26 doc

$ duls [bM]*
 28K    -rw-r--r--  1 kk  staff  24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--  1 kk  staff     75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--  1 kk  staff  24473 Jun 10 13:26 Makefile.in
128K    drwxr-xr-x  8 kk  staff    272 Jun  9 16:03 build

Wyjaśnienie:

pasteNarzędzie tworzy kolumny z jego wejściem w zależności od specyfikacji, które ją podać. Biorąc pod uwagę dwa pliki wejściowe, umieszcza je obok siebie, z tabulatorem jako separatorem.

Dajemy mu wynik du -hs -- "$@" | cut -f1jako pierwszy plik (naprawdę strumień wejściowy), a wynik ls -ld -- "$@"jako drugi plik.

W funkcji "$@"przejdzie do listy wszystkich argumentów wiersza poleceń, każdy w podwójnych cudzysłowach. Zrozumie zatem znaki globowania i nazwy ścieżek ze spacjami itp.

Podwójne minusy ( --) sygnalizują koniec opcji wiersza poleceń do dui ls. Bez nich powiedzenie duls -lby się myliło, dua każda opcja, duktóra lstego nie zrobiłaby, myliłaby ls(a opcje występujące w obu narzędziach mogą nie oznaczać tego samego i byłby to niezły bałagan).

Po cutpo duprostu wycina pierwszą kolumnę du -hswyniku (rozmiary).

Postanowiłem umieścić dane duwyjściowe po lewej stronie, w przeciwnym razie musiałbym zarządzać chwiejną prawą kolumną (ze względu na różne długości nazw plików).

Polecenie nie akceptuje flag wiersza poleceń.

Zostało to przetestowane zarówno w, jak bashi w ksh93. To nie będzie działać /bin/sh.


To miłe. Uprawnienia i rozmiary w jednej linii
Ben

7

Zawsze używam zamiast tego du -sk( -kflaga pokazująca rozmiar pliku w kilobajtach).


5
powinien to być komentarz, dostarczający dodatkowych informacji do bardziej poprawnej i lepiej wyjaśnionej zaakceptowanej odpowiedzi @molf. Nie powinna być uważana za odpowiedź samą w sobie
code_monk


7

ncdu ncurses du

To niesamowite narzędzie CLI pozwala interaktywnie znajdować duże pliki i katalogi.

Na przykład z wnętrza drzewa znanego projektu wykonujemy:

sudo apt-get install ncdu
ncdu

Wynik jest następujący:

wprowadź opis zdjęcia tutaj

Następnie wchodzę w dół i bezpośrednio na klawiaturze, aby przejść do /driversfolderu, i widzę:

wprowadź opis zdjęcia tutaj

ncdu rozmiar pliku oblicza rekurencyjnie tylko raz podczas uruchamiania dla całego drzewa, więc jest wydajny.

„Całkowite użycie dysku” w porównaniu z „Pozornym rozmiarem” jest analogiczne do tego dui wyjaśniłem to na: dlaczego wyjście „du” często tak różni się od „du -b”

Strona główna projektu: https://dev.yorhel.nl/ncdu

Powiązane pytania:

Testowane w Ubuntu 16.04.

ncdu użycie nieinteraktywne

Kolejną fajną cechą ncdujest to, że możesz najpierw zrzucić rozmiary w formacie JSON, a następnie użyć ich ponownie.

Na przykład, aby wygenerować uruchomienie pliku:

ncdu -o ncdu.json

a następnie sprawdź to interaktywnie za pomocą:

ncdu -f ncdu.json

Jest to bardzo przydatne, jeśli masz do czynienia z bardzo dużym i wolnym systemem plików, takim jak NFS.

W ten sposób możesz najpierw wyeksportować tylko raz, co może potrwać kilka godzin, a następnie przeglądać pliki, wychodzić, przeglądać ponownie itp.

Format wyjściowy to po prostu JSON, więc łatwo jest go ponownie użyć z innymi programami, np .:

ncdu -o -  | python -m json.tool | less

ujawnia prostą strukturę danych drzewa katalogów:

[
    1,
    0,
    {
        "progname": "ncdu",
        "progver": "1.12",
        "timestamp": 1562151680
    },
    [
        {
            "asize": 4096,
            "dev": 2065,
            "dsize": 4096,
            "ino": 9838037,
            "name": "/work/linux-kernel-module-cheat/submodules/linux"
        },
        {
            "asize": 1513,
            "dsize": 4096,
            "ino": 9856660,
            "name": "Kbuild"
        },
        [
            {
                "asize": 4096,
                "dsize": 4096,
                "ino": 10101519,
                "name": "net"
            },
            [
                {
                    "asize": 4096,
                    "dsize": 4096,
                    "ino": 11417591,
                    "name": "l2tp"
                },
                {
                    "asize": 48173,
                    "dsize": 49152,
                    "ino": 11418744,
                    "name": "l2tp_core.c"
                },

Testowane w Ubuntu 18.04.


1
Niesamowity. Dzięki za udostępnienie!
Frank Fu

Zgadzam się, ncdu jest właściwą drogą ... ale czy wiesz, czy można przeszukać plik JSON? To znaczy, uzyskaj pełną ścieżkę do określonego pliku / folderu.
FGV

1
@FGV Nie sądzę, że ncdu może to wypisać, jedną z możliwości może być zhakowanie prostego skryptu Pythona, który analizuje JSON.
Ciro Santilli 14 病毒 审查 六四 事件 法轮功


4

To mi się podoba

aktualizacja : Nie podobał mi się poprzedni, ponieważ nie wyświetlał plików w bieżącym katalogu, wyświetlał tylko katalogi.

Przykładowe dane wyjściowe dla /varUbuntu:

sudo du -hDaxd1 /var | sort -h | tail -n10

4.0K    /var/lock
4.0K    /var/run
4.0K    /var/www
12K     /var/spool
3.7M    /var/backups
33M     /var/log
45M     /var/webmin
231M    /var/cache
1.4G    /var/lib
1.7G    /var

3

To są świetne sugestie, ale korzystam z nich:

du -ksh * | sort -n -r

-ksh upewnia się, że pliki i foldery są wymienione w formacie czytelnym dla człowieka oraz w megabajtach, kilobajtach itp. Następnie sortujesz je numerycznie i odwracasz sortowanie, aby na pierwszym miejscu były większe.

Jedynym minusem tego polecenia jest to, że komputer nie wie, że Gigabyte jest większy niż Megabyte, więc sortuje tylko według liczb i często można znaleźć takie listy:

120K
12M
4G

Uważaj tylko na jednostkę.

To polecenie działa również na komputerze Mac ( sort -hna przykład nie).


Jeśli usuniesz -hflagę z dupolecenia, zmniejszysz tę wadę
Carlos Ricardo

Możesz też użyć -hzamiast -nsortowania.
Sebi

lub po prostu przeprowadź go przez grep G
gforce89

3
du -S

du ma jeszcze jedną przydatną opcję: -S, --separate-dirsinformowanie du, że nie zawiera rozmiaru podkatalogów - przydatne w niektórych przypadkach.

Przykład 1 - pokazuje tylko rozmiary plików w katalogu:

du -Sh  * 
3,1G    10/CR2
280M    10

Przykład 2 - pokazuje rozmiary plików i podkatalogów w katalogu:

du -h  * 
3,1G    10/CR2 
3,4G    10



2

tylko ostrzeżenie, jeśli chcesz porównać rozmiary plików. du produkuje różne wyniki w zależności od systemu plików, rozmiaru bloku, ...

Może się zdarzyć, że rozmiar plików jest inny, np. Porównanie tego samego katalogu na lokalnym dysku twardym i urządzeniu pamięci masowej USB. Używam następującego skryptu, w tym ls, aby podsumować rozmiar katalogu. Wynik w bajtach z uwzględnieniem wszystkich podkatalogów.

echo "[GetFileSize.sh] target directory: \"$1\""

iRetValue=0

uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
  echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
  iRetValue=-1
else
  echo "[GetFileSize.sh] computing size of files..."

  # use ls to compute total size of all files - skip directories as they may
  # show different sizes, depending on block size of target disk / file system
  uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
  uiLength=$(expr length "$uiTotalSize")
  if [ $uiLength -lt 1 ]; then
    uiTotalSize=0
  fi
  echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""

fi

exit "$iRetValue"

1

Aby rekurencyjnie wyświetlać rozmiary plików i podkatalogów bieżącego katalogu:

du -h .

Aby wyświetlić informacje o tym samym rozmiarze, ale bez rekurencyjnego drukowania podkatalogów (co może być ogromną listą), wystarczy użyć opcji --max-depth :

du -h --max-depth=1 .

1

Przez jakiś czas korzystałem z Nautilus (na pulpicie Gnome na RHEL 6.0) do usuwania plików z mojego folderu domowego zamiast używania rmpolecenia w bash. W rezultacie całkowity rozmiar pokazany przez

du -sh

nie użyłem sumy użycia dysku każdego podkatalogu, kiedy go użyłem

du -sh *

Minęło trochę czasu, zanim zdałem sobie sprawę, że Nautilus wysyła usunięte pliki do swojego folderu Kosz, a ten folder nie jest wymieniony w du -sh *poleceniu. Chciałem się tym podzielić, na wypadek, gdyby ktoś napotkał ten sam problem.


1

Hmm, najlepszym sposobem jest użycie tego polecenia:

du -h -x / | sort -hr >> /home/log_size.txt

Wtedy będziesz mógł uzyskać foldery we wszystkich rozmiarach na całym serwerze. Łatwo Ci pomóc znaleźć największe rozmiary.


1

Następujące jest łatwe do zapamiętania

ls -ltrapR

wyświetlić zawartość katalogu

-l Użyj długiego formatu listowania

-t sortuj według czasu modyfikacji, najpierw najnowsze

-r, - odwróć odwrotną kolejność podczas sortowania

-a, --all, nie ignoruj ​​wpisów zaczynających się od.

-p, --indicator-style = slash append / wskaźnik do katalogów

-R, --recursive lista podkatalogów rekurencyjnie

https://explainshell.com/explain?cmd=ls+-ltrapR


1

Jeśli chcesz mieć większą kontrolę nad sizekatalogiem, na którym chcesz wyświetlić katalogi, możesz użyć przełącznika threshold( -t) jak w:

$ du -ht 1000000000 | sort --reverse

du- disk usage
h - format czytelny dla człowieka
t - wielkość progowa

W tym miejscu chcemy wymienić wszystkie katalogi o rozmiarze większym niż 1 GB.

$ du -ht 1G | sort --reverse

Objaśnienie :

Jednostki opisane w wiki są następujące:

K, M, G, T, P, E, Z, Y (moc 1024) lub
KB, MB, GB, TB, PB, EB, ZB, YB (moc 1000).


0

Natknąłem się na problem podobny do opisanego przez Martina Wilde'a, w moim przypadku porównując ten sam katalog na dwóch różnych serwerach po dublowaniu za pomocą rsync.

Zamiast używać skryptu dodałem -bflagę, duktóra zlicza rozmiar w bajtach i, o ile jestem w stanie ustalić, wyeliminowałem różnice na dwóch serwerach. Nadal możesz użyć, -s -haby uzyskać zrozumiały wynik.


0

umieść w skrypcie inicjującym, takim jak .bashrc ... dostosuj def w razie potrzeby.

duh() {
  # shows disk utilization for a path and depth level
  path="${1:-$PWD}"
  level="${2:-0}"
  du "$path" -h --max-depth="$level"
}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.