Verwenden von ls zum Auflisten von Verzeichnissen und ihrer Gesamtgröße

828

Ist es möglich, unter lsUnix die Gesamtgröße eines Unterverzeichnisses und seinen gesamten Inhalt aufzulisten, im Gegensatz zu der üblichen, 4Kdass (ich nehme an) nur die Verzeichnisdatei selbst ist?

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

Nachdem ich die Manpages durchsucht habe, bin ich leer.

kmorris511
quelle
4
Sie möchten stattdessen du -s verwenden
Waffen
21
Auf der Suche nach Enten:alias ducks='du -cksh * | sort -hr | head -n 15'
Sebi

Antworten:

1550

Versuchen Sie etwas wie:

du -sh *

Kurzversion von:

du --summarize --human-readable *

Erläuterung:

du: D isk U Salbei

-s: Zeigen Sie eine Zusammenfassung für jede angegebene Datei an. (Entspricht -d 0)

-h: "Vom Menschen lesbare" Ausgabe. Verwenden Sie Einheitensuffixe: B yte, K ibibyte (KiB), M ebibyte (MiB), G ibibyte (GiB), T ebibyte (TiB) und P ebibyte (PiB). (BASE2)

molf
quelle
55
Auch -c (Gesamtsumme produzieren) ist schön.
Meridius
50
du --max-depth 1 zeigt nur Datei- / Ordnergrößen von 1 tief im Baum an, keine Unordnung mehr und leicht zu findende große Ordner in einem Ordner.
CousinCocaine
12
Wie kann man auch versteckte Dateien einbinden?
Zakaria Braksa
5
@Zak in zsh können Sie verwenden , um die *(D)versteckt Match ( d ot) Dateien neben den normalen Dateien. Wenn Sie bash verwenden, können Sie * .[!.]*beide verwenden.
Sebi
22
Ein klares Bild davon zu bekommen, wohin der Platz geht, du -sch * .[!.]* | sort -rhist großartig (zeigen Sie eine sortierte Ausgabe). Auf dem Mac: brew install coreutilsund danndu -sch * .[!.]* | gsort -rh
Guig
319

du -sk * | sort -nsortiert die Ordner nach Größe. Hilfreich bei der Suche nach freiem Raum ..

Grabräuber
quelle
11
Fügen Sie ein hinzu | tail -r, um zuerst nach dem größten zu sortieren.
Phrogz
68
sort -rnsortiert die Dinge in umgekehrter numerischer Reihenfolge. sort -rn | head -n 10zeigt nur die wenigen Top, wenn das von Interesse ist.
AgileTillIDie
14
sort -rhfunktioniert gut mit, du -cksh *da es lesbare Einheiten sortiert.
Sebi
@Sebi -h ist leider kein gültiger Parameter für die Sortierung auf einem Mac
anon58192932
@Sebi auch das -c ist nicht nötig, du -ksh | sort -rnist das gleiche wie du -cksh | sort -rn. Genauso wie du -kshes das gleiche ist wie du -cksh.
Hallo_there_andy
108
du -sh * | sort -h

Dies wird in einem für Menschen lesbaren Format angezeigt.

user2969885
quelle
6
Mehr über sort -hhier: gnu.org/software/coreutils/manual/... Es ist vor allem dort zum Sortieren 103K, 102M, 1.1Getc. Dies heutzutage auf vielen Systemen verfügbar sein sollten, aber nicht alle.
Evgeni Sergeev
duh -shm * | sort -n?
std''OrgnlDave
10
funktioniert du -sh * | sort -rh
super
Um versteckte Dateien / Verzeichnisse einzuschließen; du -sh $(ls -A) | sort -h
jmd_dk
55

So listen Sie die größten Verzeichnisse aus dem aktuellen Verzeichnis in lesbarem Format auf:

du -sh * | sort -hr

Ein besserer Weg, um die Anzahl der Zeilen zu beschränken, kann sein

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

Hier können Sie das -nFlag- Suffix erhöhen , um die Anzahl der aufgelisteten Zeilen zu beschränken

Stichprobe:

[~]$ 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

Es macht es bequemer zu lesen :)

Jay Chakra
quelle
27

ls -lhVerwenden Sie Folgendes, um es im Format anzuzeigen :

(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} }'

Awk-Code erklärt:

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
}

Beispielausgabe:

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
Sebi
quelle
Wie kann man diese Ausgabe sortieren? Auch für jeden auf dem Mac funktioniert dies hervorragend, wenn Sie entfernen--color=no
anon58192932
@ anon58192932 Sie können die Ausgabe an weiterleiten, sort --key=5,5hum 'von Menschen lesbare Einheiten' aus der fünften Spalte zu sortieren
Sebi
gibt sort: stray character in field spec: invalid field specification 5,5h'` zurück. Ich hasse Macs manchmal wirklich = \
anon58192932
@ anon58192932 Sie können eine Frage zu Mac stellen, ich bin sicher, es gibt jemanden, der helfen könnte. Diese Frage ist markiert als GNU / Linux
Sebi
2
Gibt es eine Möglichkeit, mit dieser Antwort Farbe zu bewahren?
Pablo Canseco
20

Der gewünschte Befehl lautet 'du -sk' du = "Festplattennutzung"

Das Flag -k gibt die Ausgabe in Kilobyte an und nicht die Standardeinstellung für Festplattensektoren (512-Byte-Blöcke).

Das Flag -s listet nur Dinge im Verzeichnis der obersten Ebene auf (dh standardmäßig das aktuelle Verzeichnis oder das in der Befehlszeile angegebene Verzeichnis). Es ist seltsam, dass du in dieser Hinsicht das entgegengesetzte Verhalten von ls hat. Standardmäßig gibt du rekursiv die Festplattennutzung jedes Unterverzeichnisses an. Im Gegensatz dazu gibt ls nur Listendateien im angegebenen Verzeichnis an. (ls -R gibt Ihnen rekursives Verhalten.)

Keith Smith
quelle
Versucht dies im Stammverzeichnis, versucht es immer noch, Unterverzeichnisse aufzulisten, was zu vielen Nachrichten führt.
Nagev
14

Fügen Sie diese Shell-Funktionsdeklaration in Ihre Shell-Initialisierungsskripte ein:

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

Ich habe es genannt, dulsweil es die Ausgabe von beiden duund ls(in dieser Reihenfolge) zeigt:

$ 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

Erläuterung:

Das paste Dienstprogramm erstellt aus seiner Eingabe Spalten gemäß der von Ihnen angegebenen Spezifikation. Bei zwei Eingabedateien werden diese nebeneinander mit einer Registerkarte als Trennzeichen angezeigt.

Wir geben ihm die Ausgabe von du -hs -- "$@" | cut -f1als erste Datei (Eingabestream wirklich) und die Ausgabe vonls -ld -- "$@" als zweite Datei.

In der Funktion "$@" wird die Liste aller Befehlszeilenargumente in doppelten Anführungszeichen ausgewertet. Es werden daher Globbing-Zeichen und Pfadnamen mit Leerzeichen usw. verstanden.

Das Doppel minuse ( --) signalisiert das Ende der Befehlszeilenoptionen zu duund ls. Ohne diese duls -lwürde das Sprichwort verwirren duund jede Option du, die lses nicht gibt, würde verwirren ls(und die Optionen, die in beiden Dienstprogrammen vorhanden sind, bedeuten möglicherweise nicht dasselbe, und es wäre ein ziemliches Durcheinander).

Die cutnach dueinfach schneidet die erste Spalte des aus du -hsAusgang (die Größen).

Ich habe mich entschieden, die duAusgabe links zu platzieren, sonst hätte ich eine wackelige rechte Spalte verwalten müssen (aufgrund der unterschiedlichen Länge der Dateinamen).

Der Befehl akzeptiert keine Befehlszeilenflags.

Dies wurde sowohl bashin als auch in getestet ksh93. Es wird nicht funktionieren mit /bin/sh.

Kusalananda
quelle
Das ist schön. Berechtigungen und Größen in einer Zeile
Ben
7

Ich benutze stattdessen immer du -sk( -kFlag, das die Dateigröße in Kilobyte anzeigt).

Crenshaw
quelle
5
Dies sollte ein Kommentar sein, der zusätzliche Informationen zu der korrekteren und besser erklärten akzeptierten Antwort von @molf liefert. Es sollte nicht als eigenständige Antwort betrachtet werden
code_monk
7
du -h --max-depth=1 . | sort -n -r
Sternenstaub
quelle
1
du -h -d 1 für maximale Tiefe von 1. Kurzform.
Opossumkeys
7

ncdu Flüche du

Mit diesem fantastischen CLI-Dienstprogramm können Sie die großen Dateien und Verzeichnisse einfach interaktiv finden.

Zum Beispiel machen wir aus dem Baum eines bekannten Projekts heraus :

sudo apt-get install ncdu
ncdu

Das Ergebnis ist:

Geben Sie hier die Bildbeschreibung ein

Dann gebe ich unten und rechts auf meiner Tastatur ein, um in den /driversOrdner zu gelangen, und ich sehe:

Geben Sie hier die Bildbeschreibung ein

ncdu Berechnet die Dateigröße beim Start nur einmal rekursiv für den gesamten Baum, sodass sie effizient ist.

"Gesamtfestplattenauslastung" im Vergleich zu "Scheinbare Größe" ist analog zu du, und ich habe es unter folgendem erklärt: Warum unterscheidet sich die Ausgabe von "du" oft so stark von "du-b"?

Projekthomepage: https://dev.yorhel.nl/ncdu

Verwandte Fragen:

Getestet in Ubuntu 16.04.

ncdu nicht interaktive Nutzung

Eine weitere coole Funktion von ncduist, dass Sie die Größen zuerst in einem JSON-Format sichern und später wiederverwenden können.

So generieren Sie beispielsweise den Dateilauf:

ncdu -o ncdu.json

und dann interaktiv untersuchen mit:

ncdu -f ncdu.json

Dies ist sehr nützlich, wenn Sie mit einem sehr großen und langsamen Dateisystem wie NFS arbeiten.

Auf diese Weise können Sie zuerst nur einmal exportieren, was Stunden dauern kann, und dann die Dateien durchsuchen, beenden, erneut untersuchen usw.

Das Ausgabeformat ist nur JSON, daher ist es einfach, es auch mit anderen Programmen wiederzuverwenden, z.

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

zeigt eine einfache Verzeichnisbaumdatenstruktur:

[
    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"
                },

Getestet in Ubuntu 18.04.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
quelle
1
Tolle. Danke für das Teilen!
Frank Fu
Ich stimme zu, ncdu ist der richtige Weg ... aber wissen Sie, ob es möglich ist, die JSON-Datei zu durchsuchen? Das heißt, Sie erhalten den vollständigen Pfad einer bestimmten Datei / eines bestimmten Ordners.
FGV
1
@FGV Ich glaube nicht, dass ncdu das ausgeben kann. Eine Möglichkeit wäre, ein einfaches Python-Skript zu hacken, das den JSON analysiert.
Ciro Santilli 14 病毒 审查 六四 事件 14
4

du -sch * im selben Verzeichnis.

John
quelle
4

Dies ist eine, die ich mag

Update : Das vorherige hat mir nicht gefallen, da es keine Dateien im aktuellen Verzeichnis anzeigt, sondern nur Verzeichnisse auflistet.

Beispielausgabe für /varon ubuntu:

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
Meffekt
quelle
3

Dies sind alles großartige Vorschläge, aber der, den ich verwende, ist:

du -ksh * | sort -n -r

-ksh Stellen Sie sicher, dass die Dateien und Ordner in einem für Menschen lesbaren Format und in Megabyte, Kilobyte usw. aufgelistet sind. Anschließend sortieren Sie sie numerisch und kehren die Sortierung um, sodass die größeren Dateien an erster Stelle stehen.

Der einzige Nachteil dieses Befehls ist, dass der Computer nicht weiß, dass Gigabyte größer als Megabyte ist, sodass er nur nach Zahlen sortiert und häufig folgende Einträge gefunden werden:

120K
12M
4G

Achten Sie nur darauf, das Gerät zu betrachten.

Dieser Befehl funktioniert auch auf dem Mac (wohingegen sort -hdies beispielsweise nicht der Fall ist).

Kakubei
quelle
Wenn Sie die -hFlagge aus dem duBefehl entfernen , schneiden Sie diesen Nachteil
Carlos Ricardo
Oder Sie können auch -hanstelle von -nSortierung verwenden.
Sebi
oder
leiten Sie
3
du -S

du hast eine andere nützliche Option: du-S, --separate-dirs erzählst du nicht enthält Größe Verzeichnisse - praktisch bei einigen Gelegenheiten.

Beispiel 1 - zeigt nur die Dateigrößen in einem Verzeichnis:

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

Beispiel 2 - zeigt die Dateigrößen und Unterverzeichnisse im Verzeichnis:

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

du -sm * | sort -nr

Ausgabe nach Größe

Amir
quelle
2

Schauen Sie sich den duBefehl dafür an

Zappan
quelle
2

Nur eine Warnung, wenn Sie die Größe von Dateien vergleichen möchten. du erzeugt je nach Dateisystem, Blockgröße, .... unterschiedliche Ergebnisse.

Es kann vorkommen, dass die Größe der Dateien unterschiedlich ist, z. B. wenn Sie dasselbe Verzeichnis auf Ihrer lokalen Festplatte mit einem USB-Massenspeichergerät vergleichen. Ich verwende das folgende Skript, einschließlich ls, um die Verzeichnisgröße zusammenzufassen. Das Ergebnis sind Bytes, die alle Unterverzeichnisse berücksichtigen.

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"
Martin Wilde
quelle
1

So zeigen Sie die Dateien und Unterverzeichnisse des aktuellen Verzeichnisses rekursiv an:

du -h .

Um die Anzeige zu gleichen Größeninformationen aber ohne den Druck ihrer Unterverzeichnisse rekursiv (die eine riesige Liste sein kann), benutzen Sie einfach die --max eingehende Option:

du -h --max-depth=1 .
Pascal
quelle
1

Für eine Weile habe ich Nautilus (auf dem Gnome-Desktop unter RHEL 6.0) verwendet, um Dateien in meinem Home-Ordner zu löschen, anstatt den rmBefehl in bash zu verwenden. Als Ergebnis wird die Gesamtgröße durch angezeigt

du -sh

stimmte nicht mit der Summe der Festplattennutzung jedes Unterverzeichnisses überein, als ich es verwendete

du -sh *

Es hat eine Weile gedauert, bis mir klar wurde, dass Nautilus die gelöschten Dateien an seinen Papierkorbordner sendet und dieser Ordner nicht im du -sh *Befehl aufgeführt ist. Ich wollte dies nur teilen, falls jemand vor dem gleichen Problem stand.

CrossEntropy
quelle
1

Hmm, der beste Weg ist, diesen Befehl zu verwenden:

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

Dann können Sie Ordner aller Größen über Ihren gesamten Server abrufen. Einfach, Ihnen zu helfen, die größten Größen zu finden.

Xanarus
quelle
1

Folgendes ist leicht zu merken

ls -ltrapR

Verzeichnisinhalt auflisten

-Ich verwende ein langes Listenformat

-t nach Änderungszeit sortieren, neueste zuerst

-r, - beim Sortieren die umgekehrte Reihenfolge umkehren

-a, --all ignoriert Einträge, die mit beginnen.

-p, --indicator-style = Schrägstrich an Verzeichnisse anhängen / anzeigen

-R, --rekursive Listenunterverzeichnisse rekursiv

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

NVRM
quelle
1

Wenn Sie mehr Kontrolle über die sizeVerzeichnisse haben möchten, über die Sie die Verzeichnisse auflisten möchten, können Sie den Schalter threshold( -t) wie folgt verwenden:

$ du -ht 1000000000 | sort --reverse

du- disk usage
h - lesbares Format
t - Schwellengröße

Hier möchten wir alle Verzeichnisse auflisten, die größer als 1 GB sind.

$ du -ht 1G | sort --reverse

Erklärung :

Einheiten, die im Wiki beschrieben werden, folgen:

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

kmario23
quelle
0

Ich bin auf ein Problem gestoßen, das dem von Martin Wilde beschriebenen ähnelt. In meinem Fall habe ich nach dem Spiegeln mit rsync dasselbe Verzeichnis auf zwei verschiedenen Servern verglichen.

Anstatt ein Skript zu verwenden, habe ich das -bFlag hinzugefügt , das dudie Größe in Bytes zählt, und soweit ich feststellen kann, die Unterschiede auf den beiden Servern beseitigt. Sie können immer noch verwenden -s -h, um eine verständliche Ausgabe zu erhalten.

Bool-Typ
quelle
0

Platziere es in einem Init-Skript wie .bashrc ... passe def nach Bedarf an.

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

Geben Sie "ls -ltrh / path_to_directory" ein.

user6051290
quelle