Ich muss die größten Dateien in einem Ordner finden.
Wie scanne ich einen Ordner rekursiv und sortiere den Inhalt nach Größe?
Ich habe versucht mit ls -R -S
, aber das listet die Verzeichnisse auch.
Ich habe auch versucht mit find
.
Ich muss die größten Dateien in einem Ordner finden.
Wie scanne ich einen Ordner rekursiv und sortiere den Inhalt nach Größe?
Ich habe versucht mit ls -R -S
, aber das listet die Verzeichnisse auch.
Ich habe auch versucht mit find
.
Antworten:
Sie können dies auch mit nur tun du
. Um auf der sicheren Seite zu sein, benutze ich diese Version von du
:
$ du --version
du (GNU coreutils) 8.5
Die Vorgehensweise:
$ du -ah ..DIR.. | grep -v "/$" | sort -rh
Der Befehl erstellt du -ah DIR
eine Liste aller Dateien und Verzeichnisse in einem bestimmten Verzeichnis DIR
. Das -h
Ergebnis sind vom Menschen lesbare Größen, die ich bevorzuge. Wenn Sie sie nicht wollen, lassen Sie diesen Schalter fallen. Ich benutze die head -6
nur, um die Menge der Ausgabe zu begrenzen!
$ du -ah ~/Downloads/ | head -6
4.4M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M /home/saml/Downloads/kodak_W820_wireless_frame
8.0K /home/saml/Downloads/bugs.xls
604K /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf
Einfach genug, um es vom kleinsten zum größten zu sortieren:
$ du -ah ~/Downloads/ | sort -h | head -6
0 /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock
Kehre es um, vom größten zum kleinsten:
$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
Zeige mir nicht das Verzeichnis, nur die Dateien:
$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
Wenn Sie nur die Liste der kleinsten bis größten Dateien, aber der 6 wichtigsten Dateien anzeigen möchten, können Sie den Sortierschalter umkehren, drop ( -r
) und tail -6
anstelle von verwenden head -6
.
$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G /home/saml/Downloads/digital_blasphemy
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G /home/saml/Downloads/apps_archive
3.8G /home/saml/Downloads/audible
3.8G /home/saml/Downloads/audible/audio_books
grep -v "/$"
Teil scheint nicht das zu tun, was Sie erwartet haben, da an die Verzeichnisse kein Schrägstrich angehängt ist. Weiß jemand, wie man Verzeichnisse von den Ergebnissen ausschließt?
/
s - zum Beispiel /home/saml/Downloads/audible
scheint es sich um ein Verzeichnis zu handeln, es ist jedoch kein Schrägstrich enthalten. Hat /home/saml/Downloads/
nur einen Schrägstrich, aber das liegt wahrscheinlich daran, dass Sie ihn mit einem Schrägstrich geschrieben haben, als Sie das Argument für initial angegeben haben du
.
Wenn Sie alle Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen suchen und sie nach ihrer Größe (ohne Berücksichtigung ihres Pfades) auflisten möchten und annehmen möchten, dass keiner der Dateinamen Zeilenumbruchzeichen enthält find
, können Sie dies mit GNU tun:
find . -type f -printf "%s\t%p\n" | sort -n
Von man find
einem GNU-System aus:
-printf format
True; print format on the standard output,
interpreting `\' escapes and `%' directives.
Field widths and precisions can be specified
as with the `printf' C function. Please note
that many of the fields are printed as %s
rather than %d, and this may mean that flags
don't work as you might expect. This also
means that the `-' flag does work (it forces
fields to be left-aligned). Unlike -print,
-printf does not add a newline at the end of
the string. The escapes and directives are:
%p File's name.
%s File's size in bytes.
Von man sort
:
-n, --numeric-sort
compare according to string numerical value
Versuchen Sie den folgenden Befehl:
ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20
Die 20 größten Dateien im aktuellen Verzeichnis werden rekursiv aufgelistet.
Hinweis: Die Option -h
für sort
ist unter OSX / BSD nicht verfügbar. Sie müssen also sort
von coreutils
(z. B. über brew
) installieren und den lokalen bin-Pfad auf PATH
z. B. anwenden
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
Alternativ verwenden Sie:
ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20
Für die größten Verzeichnisse verwenden Sie du
zB:
du -ah . | sort -rh | head -20
oder:
du -a . | sort -rn | head -20
Dies findet alle Dateien rekursiv und sortiert sie nach Größe. Es druckt alle Dateigrößen in KB aus und rundet ab, sodass Sie möglicherweise 0 KB-Dateien sehen, aber es war nah genug für meine Zwecke und funktioniert unter OSX.
find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1
find . -type f
findet Dateien ... es funktioniert rekursiv, Sie haben Recht, aber es listet alle Dateien, die es findet, nicht die Verzeichnisse selbst
Mit zsh
finden Sie die größte Datei (in Bezug auf die scheinbare Größe wie die Größenspalte in der ls -l
Ausgabe, nicht die Festplattennutzung) mit:
ls -ld -- **/*(DOL[1])
Für die 6 größten:
ls -ld -- **/*(DOL[1,6])
Die nach Dateigröße zu sortieren, können Sie ls
‚s - -S
Option. Einige ls
Implementierungen haben auch die -U
Option ls
, die Liste nicht zu sortieren (da sie hier bereits nach Größe sortiert zsh
ist).
Dies ist aus verschiedenen Gründen ein unglaublich häufiges Bedürfnis (ich finde es toll, die neueste Sicherung in einem Verzeichnis zu finden) und ist eine überraschend einfache Aufgabe.
Ich werde eine Linux-Lösung bereitstellen, die die Dienstprogramme find, xargs, stat, tail, awk und sort verwendet.
Die meisten Leute haben einige eindeutige Antworten geliefert, aber ich bevorzuge meine, weil sie Dateinamen richtig handhabt und der Anwendungsfall leicht geändert werden kann (Änderung der Statistik und Sortierung der Argumente).
Ich werde auch eine Python-Lösung bereitstellen, mit der Sie diese Funktionalität auch unter Windows verwenden können
find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n
# Each utility is split on a new line to help
# visualize the concept of transforming our data in a stream
find . -type f -print0 |
xargs -0 -I{} stat -c '%s %n' {} |
sort -n |
tail -n 1 |
awk '{print $2}'
# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} |
sort -n | tail -n 1 | awk '{print $2}'
Erläuterung:
#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
for filename in filenames:
realpath = os.path.join(dirpath, filename)
files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)
Die Erklärung dieses Skripts dauert etwas länger. Wenn Sie es jedoch als Skript speichern, durchsucht es das erste Argument in der Befehlszeile und gibt die größte Datei in diesem Verzeichnis zurück. Das Skript führt keine Fehlerprüfung durch, sollte Ihnen jedoch eine Vorstellung davon geben, wie Sie dies in Python angehen können. Auf diese Weise können Sie dieses Problem plattformunabhängig lösen.
Variante dieser Antwort aus einer ähnlichen Frage
find . -type f -exec du -ah {} + | sort -rh | more
Versuchen Sie es mit dem folgenden Befehl mit der Sortieroption, um Ordner mit einer Größe in aufsteigender Reihenfolge zu erhalten
du -sh * | sort -sh