Finden Sie die größten Dateien oder Verzeichnisse


10

Welcher Befehl druckt die Größen aller Dateien und Verzeichnisse im tmp-Verzeichnis (einschließlich der versteckten) und sortiert sie nach Größen von der größten zur kleinsten im lesbaren Format (z. B. 2 GB)?

Die Ausgabe könnte wie folgt sein:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

Ich habe versucht, die Befehle lsund zu verwenden du, konnte jedoch nicht die richtigen Schalter finden.

Antworten:


7

Hier ist eine schnelle Lösung: Verwenden Sie du + sort. Versuche dies:

du -smc * | sort -n

Dadurch werden versteckte Dateien ignoriert, aber das ist eine weitere einfache Lösung:

du -smc .[^.] .??* * | sort -n

Dies kann zu Warnungen führen, wenn eines oder mehrere der oben genannten Muster nicht mit einer Datei übereinstimmen. Das erste Muster .[^.]entspricht allen Dateinamen mit zwei Zeichen, beginnend mit. mit Ausnahme von .. entspricht das zweite Muster .??*allen drei Buchstaben oder mehr Dateinamen, die mit beginnen. und * stimmt mit allen Dateien überein, die nicht mit beginnen. Für eine komplexere Auflistung, z. B. das Auffinden aller Dateien, die größer als X sind, in einem gesamten Dateisystem oder das Verwalten einer Liste des Dateisystemwachstums habe ich ein DIY-Shell-Skript, das ich geschrieben habe und das Sie bei Interesse weitergeben können.


Vielen Dank. Ich interessiere mich für Ihr Skript, wenn Sie so nett sein werden.
Xralf

1
Verwenden sort -nrSie diese Option, wenn Sie die größten Werte oben haben möchten.
LawrenceC

3

So listen Sie die Dateien an einer beliebigen Stelle auf /tmp, sortiert nach Größe:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

So listen Sie die Dateien und Verzeichnisbäume unmittelbar unter auf /tmp, sortiert nach Größe:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

So listen Sie alle Dateien und Verzeichnisbäume /tmpnach Größe sortiert auf:

du -ak /tmp | sort -k1n -k2

(Ein Beispiel zur Veranschaulichung des Unterschieds zwischen den drei Befehlen: Wenn eine Datei vorhanden ist /tmp/dir/file, werden die erste Befehlsliste /tmp/dir/file, die zweite Liste /tmp/dirund die dritte Liste aufgelistet.)

Alle obigen Befehle zeigen Größen in Kilobyte. Während GNU du "vom Menschen lesbare" Größen ausgeben kann (mit Multiplikatoren k, M, G usw.), ist das Sortieren eine andere Sache. Aktuelles genug GNU coreutils (≥7.4) kann es tun: einfach ersetzen du -kmit du -hund sort -k1n -k2mit sort -k1h -k2. Andernfalls ist hier ein grobes awk-Skript zum Konvertieren in Suffixgrößen (Abrunden). Leiten Sie einfach die sortAusgabe oben hinein.

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

Vielen Dank. Diese Befehle sind nützlich, aber ich interessiere mich nur für die Dateien und Verzeichnisse direkt unter tmp, nicht für Dateien in Unterverzeichnissen
xralf

1
@xralf: Verwenden Sie dann nur die zweite Form des duAnrufs.
Gilles 'SO - hör auf böse zu sein'

Sieht gut aus, aber ein besseres Ergebnis ist mit MB und GB, wie forcefsck gepostet hat.
Xralf

3

Ich verwende folgenden Alias ​​dafür: alias ds='du -x --all --max-depth=1 . | sort -n'

Es werden die Größen aller Dateien und Unterverzeichnisse der ersten Ebene des aktuellen Verzeichnisses gedruckt.


Es ist eine schöne kurze Lösung, aber es werden nur Verzeichnisse gedruckt.
Xralf

Oh, sorry, du hast recht. Ich habe dieses Problem noch nie mit Dateien konfrontiert. Ich habe jedoch herausgefunden, wie es mit Dateien funktioniert: mit --all swicth.
RVS

Tolle richtige Lösung. penguin359 hat etwas besser, weil es die Größen in MB anzeigt. Das Beste wäre die Lösung von forcefsck, aber in seiner Lösung werden Verzeichnisse mit Leerzeichen weggelassen.
Xralf

1

Mit der aktuellen Version von gnu sort (und dem Dateimuster @ penguin359 ausleihen)

cd /tmp; du -sShc .[^.] .??* * | sort -h

Mit einer älteren Version

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

BEARBEITEN: Der Parameter -S wurde hinzugefügt du, um Unterverzeichnisse nicht einzuschließen.


Ich wollte lieber Speicherplatz, der von Dateien und Verzeichnissen (Gesamtgröße der darin enthaltenen Daten) direkt unter tmp (keine Unterverzeichnisse) verwendet wird. Mein Sortierbefehl hat keine Option -h.
Xralf

Ich bin mir nicht 100% sicher, was Sie meinen, da Sie bereits eine Antwort mit derselben Dateimusterauswahl akzeptiert haben. Mein Beitrag wurde so bearbeitet, dass er keine Unterverzeichnisse enthält. Wenn Sie die scheinbare Größe und nicht den tatsächlich verwendeten Speicherplatz möchten, können Sie --apparent-sizedu-Parameter hinzufügen .
Forcefsck

Jetzt funktioniert es gut. Ich muss nur nach GB und dann nach MB suchen, aber das ist kein Problem.
Xralf

Ich hatte die Einheitsbuchstaben in der falschen Reihenfolge, jetzt behoben. Wenn Sie die Reihenfolge von groß nach klein wünschen, ändern Sie die Reihenfolge der Einheitsbuchstaben und fügen Sie -r zum Sortieren hinzu.
Forcefsck

Mir ist aufgefallen, dass es vergessen hat, die Größe des Verzeichnisses (ohne Präfix) zu drucken
xralf

0

UPDATE: Ich habe das vorherige Skript verschrottet. Hier ist eine neue Version, die duund verwendet awk (die vorherige verwendet treeund sed)

Dies ist die Ausgabe von: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

Hier ist das Skript

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

Wenn Sie die Größe aller Dateien und Verzeichnisse angeben , meinen Sie damit den Speicherplatz, den jedes Element auf der Festplatte belegt (z. B. auf meinem Ubuntu ext4- Dateisystem, ein leeres Verzeichnis belegt 4 KB Speicherplatz und eine Datei, die kleiner als 4 KB ist, 4 KB der Brocken Mindestzuteilungs. ist 4k) .. oder meinst du die Menge der Daten in jeder Datei, zB 100 (Bytes) .. und für Verzeichnisse, haben Sie die Summe der Datei wissen wollen Daten in diesem Verzeichnis .. Wenn Sie möchten die Größe der Daten in Dateien, dann tun Sie treedas. Wenn Sie möchten, dass der Speicherplatz verwendet wird, dann dutree
tun Sie

'du' ist die bessere Wahl ... Ich habe gerade bemerkt man du, dass es auch die "scheinbare Dateigröße" angeben kann .... The apparent size of a file is the number of bytes reported by wc -c 'für reguläre Dateien oder allgemeiner ls -l --block-size=1' or stat --format =% s '. Zum Beispiel eine Datei mit dem Wortzoo' with no newline would, of course, have an apparent size of 3.
Peter.O

Ich wollte lieber Speicherplatz, der von Dateien und Verzeichnissen (Gesamtgröße der Daten darin) direkt unter tmp (keine Unterverzeichnisse) verwendet wird
xralf

Es tut mir leid, ich bin noch nicht in der Phase des Shell-Scripting. Ich konnte es noch verstehen. Ich überlasse es anderen Benutzern, zu entscheiden, wie gut die Antwort ist. Danke für deine Arbeit. Ich werde es studieren, wenn es mir besser geht.
Xralf

0
find /tmp -exec du {} + | sort -nr | less 

zeigt zuerst die größten Dateien an, sodass Sie sie verwenden können, qsobald Sie genug gesehen haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.