it-swarm.com.de

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

Ist es möglich, ls in Unix zu verwenden, um die Gesamtgröße eines Unterverzeichnisses und seinen gesamten Inhalt im Gegensatz zu den üblichen 4K aufzulisten, die (ich nehme an) nur die Verzeichnisdatei selbst ist? I.E.

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

Nach dem Durchsuchen der Manpages komme ich leer raus.

684
kmorris511

Versuchen Sie etwas wie:

du -sh *

kurze Version von:

du --summary --human-readable *

Erläuterung:

du: D isk U weise

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

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

1297
molf

du -sk * | sort -n sortiert die Ordner nach Größe. Hilfreich bei der Suche nach Platz schaffen ..

273
GraveDigger
du -sh * | sort -h

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

87
user2969885

So listen Sie die größten Verzeichnisse aus dem aktuellen Verzeichnis in einem für Menschen lesbaren Format auf: 

du -sh * | sort -hr

Eine bessere Möglichkeit, die Anzahl der Zeilen einzuschränken, kann sein 

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

Hier können Sie das Suffix von -n flag erhöhen, um die Anzahl der aufgeführten Zeilen einzuschränken 

Probe: 

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

37
Jay Chakra

Um es im ls -lh-Format anzuzeigen, verwenden Sie:

(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
23
Sebi

Der gewünschte Befehl lautet 'du -sk' du = "Datenträgerverwendung"

Das Flag -k gibt die Ausgabe in Kilobyte aus und nicht die Standardeinstellung der Plattensektoren (512-Byte-Blöcke). 

Das Flag -s listet nur Elemente im obersten Verzeichnis auf (d. H. Standardmäßig das aktuelle Verzeichnis oder das in der Befehlszeile angegebene Verzeichnis). Es ist seltsam, dass du in dieser Hinsicht das gegenteilige Verhalten von ls hat. Standardmäßig geben Sie die Datenträgerauslastung für jedes Unterverzeichnis rekursiv an. Im Gegensatz dazu gibt ls nur Listendateien im angegebenen Verzeichnis an. (ls -R gibt Ihnen rekursives Verhalten.)

20
Keith Smith

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

function duls {
    paste <( du -hs -- "[email protected]" | cut -f1 ) <( ls -ld -- "[email protected]" )
}

Ich habe es duls genannt, weil es die Ausgabe sowohl von du als auch von ls zeigt (in dieser Reihenfolge):

$ 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 Dienstprogramm paste erstellt Spalten aus seiner Eingabe gemäß der von Ihnen angegebenen Spezifikation. Bei zwei Eingabedateien werden diese nebeneinander mit einem Tab als Trennzeichen angezeigt.

Wir geben ihm die Ausgabe von du -hs -- "[email protected]" | cut -f1 als erste Datei (wirklich den Eingabestrom) und die Ausgabe von ls -ld -- "[email protected]" als zweite Datei.

In der Funktion wird "[email protected]" in der Liste aller Befehlszeilenargumente ausgewertet, jeweils in Anführungszeichen. Es werden daher Globbing-Zeichen und Pfadnamen mit Leerzeichen usw. verstanden.

Die doppelten Minuszeichen (--) signalisieren das Ende der Befehlszeilenoptionen auf du und ls. Ohne diese würde duls -ldu verwechseln, und jede Option für du, die ls nicht hat, würde ls verwechseln (und die Optionen, die in beiden Dienstprogrammen vorhanden sind, bedeuten möglicherweise nicht dasselbe, und es wäre ein ziemlich Durcheinander).

Die Variable cut nach du schneidet einfach die erste Spalte der du -hs-Ausgabe (die Größen) aus.

Ich entschied mich dafür, die du-Ausgabe auf die linke Seite zu setzen, sonst hätte ich eine wacklige rechte Spalte (aufgrund unterschiedlicher Längen der Dateinamen) verwalten müssen.

Der Befehl akzeptiert keine Befehlszeilenflags. 

Dies wurde sowohl in bash als auch in ksh93 getestet. Es funktioniert nicht mit /bin/sh.

10
Kusalananda
du -h --max-depth=1 . | sort -n -r
7
StarDust

Ich benutze stattdessen immer du -sk (-k-Flag, das die Dateigröße in Kilobyte angibt). 

7
Crenshaw

Das gefällt mir

update : Ich mochte den vorherigen nicht, weil er keine Dateien im aktuellen Verzeichnis zeigte, sondern nur Verzeichnisse auflistete.

Beispielausgabe für /var auf 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
4
meffect

du -sch * im selben Verzeichnis.

4
John
du -S

du hat eine andere nützliche Option: -S, --separate-dirs, das du nicht die Größe der Unterverzeichnisse einschließt - bei manchen Gelegenheiten praktisch.

Beispiel 1 - zeigt only 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
3
sopel

Dies sind alles tolle Vorschläge, aber ich verwende Folgendes:

du -ksh * | sort -n -r

-ksh sorgt dafür, dass die Dateien und Ordner in einem für Menschen lesbaren Format und in Megabyte, Kilobyte usw. aufgelistet werden. Dann sortieren Sie sie numerisch und kehren die Sortierung um, sodass die größeren zuerst stehen. 

Der einzige Nachteil dieses Befehls ist, dass der Computer nicht weiß, dass Gigabyte größer als Megabyte ist. Daher wird nur nach Zahlen sortiert und Sie finden häufig Einträge wie diese:

120K
12M
4G

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

Dieser Befehl funktioniert auch auf dem Mac (wobei sort -h zum Beispiel nicht gilt).

3
kakubei

schau dir dazu den Befehl du an

3
zappan

du -sm * | sort -nr 

Ausgabe nach Größe 

3
Amir

nur eine Warnung, wenn Sie die Dateigrößen vergleichen möchten. du erzeugt unterschiedliche Ergebnisse je nach Dateisystem, Blockgröße, ....

Es kann vorkommen, dass die Größe der Dateien unterschiedlich ist, z. Vergleichen Sie dasselbe Verzeichnis auf Ihrer lokalen Festplatte und einem USB-Massenspeichergerät. Ich verwende das folgende Skript, einschließlich ls, um die Verzeichnisgröße zusammenzufassen. Das Ergebnis in Bytes, wobei alle Unterverzeichnisse berücksichtigt werden.

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"
2
Martin Wilde

ncduNAME__ NCURSES duNAME_

Mit diesem großartigen CLI-Dienstprogramm können Sie die großen Dateien und Verzeichnisse auf einfache Weise interaktiv finden.

Zum Beispiel aus dem Baum eines bekannten Projektes machen wir:

Sudo apt-get install ncdu
ncdu

Das Ergebnis ist:

 enter image description here

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

 enter image description here

ncduberechnet die Dateigröße beim Start des gesamten Baums nur einmal rekursiv, was effizient ist.

"Gesamte Festplattennutzung" vs "Scheinbare Größe" ist analog zu duname__, und ich habe es erklärt bei: Warum ist die Ausgabe von "du" oft so unterschiedlich von "du -b"

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

Verwandte Fragen:

Getestet in Ubuntu 16.04.

So zeigen Sie die Größe der Dateien und Unterverzeichnisse des aktuellen Verzeichnisses rekursiv an:

du -h .

Um die gleiche Größeninformation anzuzeigen aber ohne ihre Unterordner rekursiv zu drucken (was eine riesige Liste sein kann), verwenden Sie einfach die Option --max-depth:

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

Eine Zeit lang habe ich mit Nautilus (auf dem Gnome-Desktop unter RHEL 6.0) Dateien in meinem Home-Ordner gelöscht, anstatt den Befehl rm in bash zu verwenden. Als Ergebnis wird die Gesamtgröße durch angezeigt 

du -sh

bei meiner Verwendung entsprach die Summe der Festplattennutzung der einzelnen Unterverzeichnisse nicht

du -sh *

Ich habe eine Weile gebraucht, um zu realisieren, dass Nautilus die gelöschten Dateien in den Papierkorbordner schickt, und dieser Ordner ist nicht im Befehl du -sh * aufgeführt. Also wollte ich das nur teilen, falls jemand das gleiche Problem hatte. 

1
CrossEntropy

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

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

Dann können Sie alle Größenordner auf allen Servern abrufen. Einfach zu helfen, die größten Größen zu finden.

1
Xanarus

Das Folgende ist leicht zu merken 

ls -ltrapR

verzeichnisinhalt auflisten

-l verwendet ein langes Listungsformat

-t nach Änderungszeit sortieren, neueste zuerst

-r, --reverse umgekehrte Reihenfolge beim Sortieren

-a, --all ignorieren Sie keine Einträge, die mit beginnen.

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

-R, --recursive Liste Unterverzeichnisse rekursiv

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

0
Cryptopat

platzieren Sie in Init-Skript wie .bashrc ... passen Sie 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"
}
0
Goran B.

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

$ du -ht 1000000000 | sort --reverse

du - disk usage
h - vom Menschen lesbares Format
t - Schwellwertgröß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 sind folgt:

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

0
kmario23

Ich stieß auf ein Problem, das dem von Martin Wilde ähnlich war. In meinem Fall vergleicht er dasselbe Verzeichnis auf zwei verschiedenen Servern, nachdem er mit rsync gespiegelt wurde. 

Anstatt ein Skript zu verwenden, fügte ich der du das -b-Flag hinzu, das die Größe in Bytes zählt und soweit ich die Unterschiede auf den beiden Servern beseitigen kann. Sie können weiterhin -s -h verwenden, um eine verständliche Ausgabe zu erhalten.

0
booltype