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.
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.
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?
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:
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:
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)
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 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
}
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 .
man ls
:-S sort by file size
Antworten:
Verwenden Sie einfach etwas wie:
Hauptstadt S .
Dadurch werden die Dateien nach Größe sortiert.
Siehe auch:
man ls
Wenn Sie in umgekehrter Reihenfolge sortieren möchten , fügen Sie einfach den
-r
Schalter hinzu.Aktualisieren:
So schließen Sie Verzeichnisse aus (und sofern keiner der Dateinamen oder Symlink-Ziele Zeilenumbrüche enthält):
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:Auf meinem System werden nur normale Dateien angezeigt.
Update 3:
Um eine Rekursion hinzuzufügen, würde ich die Sortierung der Zeilen dem
sort
Befehl überlassen und ihn anweisen, die fünfte Spalte zum Sortieren zu verwenden.-rn
bedeutet "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:
Der
find
Befehl findet rekursiv alle Dateien in allen Unterverzeichnissen von.
und calldu -h
(dh Datenträgerverwendung -humanreadable ) und sortiert dann die Ausgabe erneut. Wenn Ihrfind
/sort
nicht unterstützt-h
, ersetzen Sie mitdu -k
undsort -rn
. Beachten Sie, dass Größe und Datenträgerverwendung nicht dasselbe sind.quelle
du
Gibt die Datenträgernutzung an, die von der Dateigröße abweicht. Mit (GNU)du -h
funktioniert die numerische Sortierung nicht (-h
zum 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.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
.+ |
Syntax erklären+ | sort -r -h
?Sie könnten so etwas wie Suchen und Sortieren verwenden.
(Die
-ls
Option ist nicht Standard, wird aber in vielen Suchimplementierungen verwendet, nicht nur in der GNU-Implementierung. In der GNU-Suche und anderen wirdls -li
mit 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:
quelle
Mit zsh und GNU ls:
Wo
(.OL)
ist ein Glob-Qualifizierer ,.
um nur reguläre Dateien auszuwählen ,OL
um die Reihenfolge nach Länge umzukehren (Dateigröße,o
aufsteigende Reihenfolge,O
absteigende 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:
Wenn Sie nur die Liste der Dateien und nicht die detaillierte Ausgabe möchten, tun Sie einfach Folgendes:
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 dasD
Globbing-Qualifikationsmerkmal hinzu:quelle
.OL
tun? Gehört das zum Befehl?ls (GNU coreutils) 8.25
undzsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Funktioniert es nur für bestimmte Versionen vonls
undzsh
?Liste Dateien nach Größe aufsteigend wäre:
Die Optionen sind:
quelle
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
find
zu tun ist:Dies "findet" alle Dateien im aktuellen Arbeitsverzeichnis (
.
). Für jede gefundene Datei wird einls
Prozess ausgeführt, um die gefundenen Objekte in der Größenreihenfolge zu sortieren. Das+
Abschlusszeichen an-exec
bewirkt, dass mehrere Argumente als Liste an übergeben werdenls
. 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.quelle
Dateilistenanzeige in umgekehrter Reihenfolge:
ls -lSrh
In aufsteigender Reihenfolge:
ls -lSh
quelle
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.quelle
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
quelle
sed
, um die Ausgabe zu schneidenZur Antwort von delh und zum Kommentar von Stéphane Chazelas hinzufügen ...
find -print0
kombiniert mitxargs -0
fü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 .
quelle
Als Variation der ursprünglichen Frage, wenn Sie die kumulative Größe von Dateien in den Unterverzeichnissen sehen möchten:
Die Größen werden in Megabyte (
m
Indu -sm
) angezeigt . Andere von akzeptierte Wertedu
gelten-k
für Kilobyte und-g
für Gigabyte. Die Verwendung-h
für eine für Menschen lesbare Anzeige ist nicht möglich, da dadurch die Sortierung unterbrochen wird.Hier ist eine Version, die
sed
zum Anhängen desM
for-Megabyte verwendet wird: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 d
listet 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.quelle