Dateien rekursiv nach Größe sortieren

78

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.

user2179293
quelle
1
Möchten Sie die Dateien in jedem Unterverzeichnis separat auflisten oder möchten Sie alle Dateien in allen Unterverzeichnissen finden und nach Größe auflisten, unabhängig davon, in welchem ​​Unterverzeichnis sie sich befinden? Und was meinst du mit "Verzeichnis" und "Ordner"? Sie scheinen sie zu benutzen, um verschiedene Dinge zu beschreiben.
Terdon
Wollen Sie damit sagen, dass Sie nur die Dateien in einem bestimmten Verzeichnis sowie die Dateien in seinen Unterverzeichnissen auflisten möchten, ohne nur die Unterverzeichnisse anzuzeigen? Bitte versuchen Sie, Ihre Frage zu bereinigen, es ist nicht sehr klar.
SLM

Antworten:

92

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

Aufschlüsselung des Ansatzes

Der Befehl erstellt du -ah DIReine Liste aller Dateien und Verzeichnisse in einem bestimmten Verzeichnis DIR. Das -hErgebnis sind vom Menschen lesbare Größen, die ich bevorzuge. Wenn Sie sie nicht wollen, lassen Sie diesen Schalter fallen. Ich benutze die head -6nur, 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 -6anstelle 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
slm
quelle
14
Das 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?
Jan Warchoł
@ JanekWarchol - welche Version von Coreutils verwenden Sie?
SLM
Ich bin am 8.13. Auf jeden Fall enthält die Ausgabe in Ihrer Antwort auch kein abschließendes /s - zum Beispiel /home/saml/Downloads/audiblescheint 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.
Jan Warchoł
1
Das findet dirs auch
ekerner
1
Hier werden nicht nur Dateien, sondern auch Verzeichnisse aufgelistet :(
Roman Gaufman
20

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 findeinem 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
terdon
quelle
Funktioniert leider nicht auf Mac, zeigt: find: -printf: Unbekannter Primär- oder Operator
Roman Gaufman
@RomanGaufman ja, deshalb gibt die Antwort GNU find an. Wenn Sie die GNU-Tools auf Ihrem Mac installieren, funktioniert dies auch dort.
Terdon
11

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 -hfür sortist unter OSX / BSD nicht verfügbar. Sie müssen also sortvon coreutils(z. B. über brew) installieren und den lokalen bin-Pfad auf PATHz. 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 duzB:

du -ah . | sort -rh | head -20

oder:

du -a . | sort -rn | head -20
Kenorb
quelle
3
Perfekt, dies ist die erste Lösung, die auf einem Mac funktioniert und keine Verzeichnisse anzeigt :) - danke!
Roman Gaufman
wie filtert man nur datei mit zeilenzahl> = X? (X = 0 zum Beispiel)
Matrix
7

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

Brad Parks
quelle
hat auch an Ubuntu 14.04 gearbeitet!
David Lam
Dies listet Verzeichnisse auf, nicht nur Dateien :(
Roman Gaufman
@RomanGaufman - Danke für das Feedback! Aus meinen Tests, find . -type ffindet Dateien ... es funktioniert rekursiv, Sie haben Recht, aber es listet alle Dateien, die es findet, nicht die Verzeichnisse selbst
Brad Parks
Xargs wurde in den 1980er Jahren verwendet. Es ist eine schlechte Idee seit 1989, als execplus von David Korn eingeführt wurde.
Schily
5

Mit zshfinden Sie die größte Datei (in Bezug auf die scheinbare Größe wie die Größenspalte in der ls -lAusgabe, 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 - -SOption. Einige lsImplementierungen haben auch die -UOption ls, die Liste nicht zu sortieren (da sie hier bereits nach Größe sortiert zshist).

Stéphane Chazelas
quelle
3

Einfache Lösung für Mac / Linux, die Verzeichnisse überspringt:

find . -type f -exec du -h {} \; | sort -h
mprcela
quelle
2

Das Äquivalent in BSDoder OSXist

$ du -ah simpl | sort -dr | head -6
Hanxue
quelle
0

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

Linux-Befehlszeilenlösung

Gibt rekursiv die gesamte Liste nur der Dateien aus einem Verzeichnis zurück, sortiert nach Dateigröße

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

Wie zuvor, aber diesmal die größte Datei zurückgeben.

# 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}'

Gleiches genaues Muster, aber jetzt die neueste anstelle der größten Datei auswählen

# (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:

  1. find: Findet rekursiv alle Dateien aus dem aktuellen Verzeichnis und druckt sie mit einem Nullzeichen aus
  2. xargs: Dienstprogramm zum Ausführen von Befehlen unter Verwendung von Argumenten aus der Standardeingabe. Für jede Ausgabezeile möchten wir das Dienstprogramm stat für diese Datei ausführen
  3. stat: Stat ist ein rundum fantastischer Befehl, der so viele Anwendungsfälle hat. Ich drucke zwei Spalten aus, wobei die erste die Blockgröße (% s) und die zweite den Dateinamen (% n) darstellt.
  4. sortieren: Sortieren Sie die Ergebnisse mit dem numerischen Schalter. Da das erste Argument eine Ganzzahl ist, werden unsere Ergebnisse ordnungsgemäß sortiert
  5. tail: Nur die letzte Ausgabezeile auswählen (da die Liste sortiert ist, ist dies die größte Datei!)
  6. awk: Wählen Sie die zweite Spalte aus, die den Dateinamen enthält und die größte Datei in einem rekursiven Verzeichnis ist.

Python-Lösung

#!/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.

Luke Pafford
quelle
0

Variante dieser Antwort aus einer ähnlichen Frage

find . -type f -exec du -ah {} + | sort -rh | more
crizCraig
quelle
0

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

Dhaval H. Nena
quelle
-1

Auf jeder Plattform außer AIX und HP-UX funktioniert Folgendes:

find . -ls | sort +6 | tail
schily
quelle