So listen Sie alle Dateien nach Größe sortiert auf


241

Ich möchte alle Dateien in der Größenordnung von groß bis klein auflisten und die Dateien können sich an einer beliebigen Stelle in einem bestimmten Ordner befinden.



5
von man ls:-S sort by file size
ctrl-alt-delor

Meinen Sie "die Dateien befinden sich in diesem Verzeichnis" oder "die Dateien können sich in einem beliebigen Unterverzeichnis befinden"?
Strg-Alt-Delor

Wenn Sie ein GUI-Tool verwenden können / möchten, werfen Sie einen Blick auf QDirStat , früher KDirStat .
RhinoDevel

Antworten:


290

Verwenden Sie einfach etwas wie:

ls -lS /path/to/folder/

Hauptstadt S .

Dadurch werden die Dateien nach Größe sortiert.

Siehe auch:

man ls

-S     sort by file size

Wenn Sie in umgekehrter Reihenfolge sortieren möchten , fügen Sie einfach den -rSchalter hinzu.

Aktualisieren:

So schließen Sie Verzeichnisse aus (und sofern keiner der Dateinamen oder Symlink-Ziele Zeilenumbrüche enthält):

ls -lS | grep -v '^d' 

Update 2:

Ich sehe jetzt, wie es immer noch symbolische Links zeigt, die Ordner sein könnten. Symbolische Links beginnen immer mit einem Buchstaben l, wie im Link.

Ändern Sie den Befehl, um nach a zu filtern -. Dies sollte nur reguläre Dateien hinterlassen:

ls -lS | grep '^-'

Auf meinem System werden nur normale Dateien angezeigt.

Update 3:

Um eine Rekursion hinzuzufügen, würde ich die Sortierung der Zeilen dem sortBefehl überlassen und ihn anweisen, die fünfte Spalte zum Sortieren zu verwenden.

ls -lR | grep '^-' | sort -k 5 -rn

-rnbedeutet "Rückwärts" und "Numerisch", um die größten Dateien oben zu erhalten. Nachteil dieses Befehls ist, dass nicht der vollständige Pfad der Dateien angezeigt wird.

Wenn Sie den vollständigen Pfad der Dateien benötigen, verwenden Sie Folgendes:

find . -type f  -exec du -h {} + | sort -r -h

Der findBefehl findet rekursiv alle Dateien in allen Unterverzeichnissen von .und call du -h(dh Datenträgerverwendung -humanreadable ) und sortiert dann die Ausgabe erneut. Wenn Ihr find/ sortnicht unterstützt -h, ersetzen Sie mit du -kund sort -rn. Beachten Sie, dass Größe und Datenträgerverwendung nicht dasselbe sind.


5
duGibt die Datenträgernutzung an, die von der Dateigröße abweicht. Mit (GNU) du -hfunktioniert die numerische Sortierung nicht ( -hzum Sortieren benötigen Sie die GNU-Option). xargs erwartet eine Liste von möglicherweise in Anführungszeichen gesetzten Wörtern als Eingabe, sodass es nicht funktioniert, wenn Dateinamen Leerzeichen oder in Anführungszeichen gesetzte Zeichen enthalten.
Stéphane Chazelas

1
Ich sehe, dass -S absteigende Größenreihenfolge hat, was ist mit aufsteigender Reihenfolge?
Demongolem

3
Im Anschluss an @ StéphaneChazelas funktioniert dies für mich: find . -type f -print0 | xargs -0 du -h | sort -rh. Wenn Sie nur die größten 30 Dateien sagen: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
user7543

Hallo! Könnten Sie bitte die + |Syntax erklären + | sort -r -h?
Victor


25

Sie könnten so etwas wie Suchen und Sortieren verwenden.

find . -type f -ls | sort -r -n -k7

(Die -lsOption ist nicht Standard, wird aber in vielen Suchimplementierungen verwendet, nicht nur in der GNU-Implementierung. In der GNU-Suche und anderen wird ls -limit wenigen Ausnahmen etwas Ähnliches angezeigt , z. B., wenn Dateien mit ACLs nicht mit einem + gekennzeichnet sind.)

Wenn die Dateinamen Zeilenumbrüche enthalten dürfen, mit GNU find und GNU sort:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'

Dies setzt voraus, dass die Spalte "group" (von -ls) keine Leerzeichen enthält (daher der Parameter -k 7), dies muss jedoch nicht der Fall sein.
Kolistivra

1
warum nicht einfach find ... -print0 | sort -zk7rn0?
Andre de Miranda

10

Mit zsh und GNU ls:

ls -ldU -- **/*(.OL)

Wo (.OL)ist ein Glob-Qualifizierer , .um nur reguläre Dateien auszuwählen , OLum die Reihenfolge nach Länge umzukehren (Dateigröße, o aufsteigende Reihenfolge, Oabsteigende Reihenfolge ).

(Beachten Sie, dass ältere Versionen von zsh Probleme mit Dateigrößen über 2 ^ 32 hatten).

Bei einigen Betriebssystemen ist die Größe der an einen Befehl übergebenen Argumentliste begrenzt. In diesen Fällen benötigen Sie:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Wenn Sie nur die Liste der Dateien und nicht die detaillierte Ausgabe möchten, tun Sie einfach Folgendes:

print -rl -- **/*(.OL)

Wenn Sie ausgeblendete Dateien einschließen möchten (deren Name mit einem Punkt außer .und beginnt ..) und auch in ausgeblendeten Verzeichnissen suchen möchten , fügen Sie das DGlobbing-Qualifikationsmerkmal hinzu:

print -rl -- **/*(.DOL)

Was bedeutet das .OLtun? Gehört das zum Befehl?
Alpha_989

@ alpha_989, siehe Bearbeiten
Stéphane Chazelas

Danke für die Erklärung, Stephane. Aus irgendeinem Grund funktioniert der Befehl auf meiner Workstation jedoch nicht. Ich verwende ls (GNU coreutils) 8.25und zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Funktioniert es nur für bestimmte Versionen von lsund zsh?
Alpha_989

@ alpha_989, wie funktioniert das bei dir nicht? Es funktioniert für mich mit denselben Versionen und es gibt nichts in diesem Code, was in den Versionen von vor mindestens 15 Jahren nicht funktioniert hätte.
Stéphane Chazelas

9

Liste Dateien nach Größe aufsteigend wäre:

ls -lSr

Die Optionen sind:

  • l: lang, zeigt detaillierten Benutzer, Gruppe, andere Attribute, Datum usw.
  • S: Sortierung nach Größe (standardmäßig absteigend)
  • r: Kehrt die Reihenfolge der Auflistung um

Würde es Ihnen etwas ausmachen, die Optionen zur Verbesserung der Antwortqualität zu erläutern?
Rui F Ribeiro

6

Wenn Sie sagen, dass die Dateien an einer beliebigen Stelle in einem bestimmten Ordner vorhanden sein könnten, müssen Sie alle Verzeichnisse (Ordner) im Startverzeichnis (Ordner) rekursiv herabstufen. Dies ist, was findzu tun ist:

find . -type f -exec ls -lSd {} +

Dies "findet" alle Dateien im aktuellen Arbeitsverzeichnis ( .). Für jede gefundene Datei wird ein lsProzess ausgeführt, um die gefundenen Objekte in der Größenreihenfolge zu sortieren. Das +Abschlusszeichen an -execbewirkt, dass mehrere Argumente als Liste an übergeben werden ls. Sofern Ihr Verzeichnis (Ordner) nicht sehr viele Dateien enthält, sollten Sie eine Liste (und damit einen Prozess) haben, die zum gewünschten Ergebnis führt.


1
Dies ist schön, da Sie den Modifikator -h auf ls verwenden können, um schöne Dateigrößen
anzuzeigen

4

Dateilistenanzeige in umgekehrter Reihenfolge: ls -lSrh

In aufsteigender Reihenfolge: ls -lSh


1
+1 für die Verwendung des Flags -h für eine benutzerfreundliche Ausgabe.
Computingfreak

2

Ich habe vor einiger Zeit etwas in diesem Umfang geschrieben. Sie können ein Argument übergeben, um anzugeben, wie viele Dateien aufgelistet werden sollen, oder einfach eingeben big, in welchem ​​Fall Sie 10 erhalten.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}

2

Probieren Sie diese aus, es funktioniert gut für mich.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Keine perfekte Antwort, funktioniert aber bis zu einem gewissen Grad

$ ls -lS |grep  '^-' | head -n 6 

1
awk funktioniert einwandfrei, wenn Dateinamen keine Leerzeichen enthalten.
Eir Nym

ja .. 'sed' benutzen und Leerzeichen durch Unterstrich ersetzen? wenn das hilft
Sand1512

Nein, ich benutze sed, um die Ausgabe zu schneiden
Eir Nym

1

Zur Antwort von delh und zum Kommentar von Stéphane Chazelas hinzufügen ...

find -print0kombiniert mit xargs -0fügt Unterstützung für Leerzeichen / Leerzeichen / Dingsbums hinzu.

du -h | sort -rn Sortiert nicht richtig zwischen verschiedenen Byte-Vielfachen, z. B. wird 1,1 MB nach 128 KB angezeigt, was falsch ist.

sort -rh (--human-numeric-sort) kümmert sich darum, aber es funktioniert nur mit der GNU-Version.

Die folgenden Befehle liefern die gewünschte Ausgabe.

Für Menschen lesbar, unter GNU / Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

In Kilobyte-Einheiten unter BSD / OSX / Andere:

find . -type f -print0 | xargs -0 du -k | sort -rn

Informationen zu BSD / OSX finden Sie auch unter https://unix.stackexchange.com/a/188375/82895 .


1

Als Variation der ursprünglichen Frage, wenn Sie die kumulative Größe von Dateien in den Unterverzeichnissen sehen möchten:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Die Größen werden in Megabyte ( mIn du -sm) angezeigt . Andere von akzeptierte Werte dugelten -kfür Kilobyte und -gfür Gigabyte. Die Verwendung -hfür eine für Menschen lesbare Anzeige ist nicht möglich, da dadurch die Sortierung unterbrochen wird.

Hier ist eine Version, die sedzum Anhängen des Mfor-Megabyte verwendet wird:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

Das anzuzeigende Verzeichnis wird festgelegt, über ${1:-.}das das erste Befehlszeilenargument verwendet wird, wenn es angegeben wird, oder das aktuelle Verzeichnis, wenn es ohne Argumente aufgerufen wird.

HINWEIS: Dies kann bei vielen Dateien sehr lange dauern. Die Option -type dlistet nur Unterverzeichnisse auf und schließt Dateien im aktuellen Ordner aus. Wenn Sie auch die Dateien im aktuellen Ordner sehen möchten, entfernen Sie sie.

Hinweis: Möglicherweise möchten Sie ncdustattdessen verwenden, was in den meisten Linux-Repos (unter Ubuntu / Debian apt install ncdu) sowie unter OSX ( brew install ncdu) verfügbar ist .

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.