Wie finde ich die größte Datei in einem Verzeichnis und seinen Unterverzeichnissen?

102

Wir starten gerade eine UNIX-Klasse und lernen eine Vielzahl von Bash-Befehlen. Unsere Aufgabe besteht darin, verschiedene Befehle in einem Verzeichnis auszuführen, in dem sich auch eine Reihe von Ordnern befinden.

Ich weiß, wie man alle regulären Dateien aus dem Stammordner auflistet und zählt, indem ich:

find . -type l | wc -l

Aber ich würde gerne wissen, wohin ich von dort aus gehen soll, um die größte Datei im gesamten Verzeichnis zu finden. Ich habe etwas in Bezug auf einen duBefehl gesehen, aber das haben wir nicht gelernt. Im Repertoire der Dinge, die wir gelernt haben, gehe ich davon aus, dass wir es irgendwie mit dem ls -tBefehl verbinden müssen.

Und verzeihen Sie mir, wenn mein 'Jargon' nicht korrekt ist, gewöhne ich mich immer noch daran!

Rekson
quelle
2
Wenn Sie einen Befehl kennen, sich aber nicht sicher sind, wie Sie ihn verwenden sollen, geben Sie ihn ein, mangefolgt von dem Befehl, an dem Sie interessiert sind. Nach oben wird ein netter manueller Eintrag für diesen Befehl angezeigt (drücken Sie q, um zur Befehlszeile zurückzukehren).
Dünen
Verwandte: unix.stackexchange.com/questions/140367/…
Ciro Santilli 21 冠状 病 六四 事件 21

Antworten:

126

Zitat aus diesem Link-

Wenn Sie die 10 größten Dateinamen (keine Verzeichnisse) in einem bestimmten Verzeichnis und seinen Unterverzeichnissen suchen und drucken möchten

$ find . -printf '%s %p\n'|sort -nr|head

Um die Suche auf das aktuelle Verzeichnis zu beschränken, verwenden Sie "-maxdepth 1" mit find.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

Und um die 10 größten "Dateien und Verzeichnisse" zu drucken:

$ du -a . | sort -nr | head

** Verwenden Sie "head -n X" anstelle des einzigen "head" oben, um die größten X-Dateien zu drucken (in allen obigen Beispielen).

Tamsler
quelle
Warum gibt "du -a. | Sort -nr | head" doppelt so viele KB zurück wie die tatsächliche Dateigröße?
xxjjnn
5
Ah, Sie müssen die Option 'k' hinzufügen, oder sie zeigt ein Vielfaches von 512 Bytes anstelle von 1024. du -ak
xxjjnn
2
Wie erhält man beim ersten die Größe in einem für Menschen lesbaren Format?
Bluz
@Bluz würde ich versuchen , zu ersetzen '%s %p\n'mit '%p\n'und das Hinzufügen |xargs ls -lhzu Ende
Duncan X Simpson
6
Die erste Lösung funktionierte unter OS X für mich nicht, daher habe ich einen schnellen Hack verwendet, um die Verzeichnisse aus der dritten Lösung herauszufiltern : du -am . | sort -nr | grep '\..*\.' | head. Dies mdient zur Anzeige der Dateigröße in Megabyte und zur Anzeige von grepZeilen mit mindestens zwei Punkten. Die erste befindet sich im ./Pfad, die zweite in der Dateierweiterung, z .mov.
Schmied
63

So finden Sie die 25 besten Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

Dadurch werden die Top-25-Dateien ausgegeben, indem nach der Größe der Dateien mit dem Piping-Befehl "sort -nr -k5" sortiert wird.

Gleich, aber mit lesbaren Dateigrößen:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25

xpros
quelle
10
find . -type f | xargs ls -lS | head -n 1

Ausgänge

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

Wenn Sie nur den Dateinamen möchten:

find . -type f | xargs ls -1S | head -n 1

Dies vermeidet die Verwendung awkund ermöglicht es Ihnen, beliebige Flags zu verwenden ls.

Einschränkung . Da xargsversucht wird, das Erstellen überlanger Befehlszeilen zu vermeiden, kann dies fehlschlagen, wenn Sie es in einem Verzeichnis mit vielen Dateien lsausführen, da es am Ende mehrmals ausgeführt wird. Es ist kein unüberwindbares Problem (Sie können die head -n 1Ausgabe von jedem lsAufruf sammeln und ls -Serneut ausführen und eine Schleife ausführen , bis Sie eine einzelne Datei haben), aber es beeinträchtigt diesen Ansatz etwas.

nneonneo
quelle
Es tut mir leid xargs, ich habe dich vernachlässigt +1
Steve
2
Verwenden Siefind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo
Dadurch werden die größten Dateien gefunden, die nur im ersten Stapel xargsausgeführt wurden. Um dies zu beheben, fügen Sie die Sortierung hinzu : find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. Hat für mich an OSX gearbeitet.
Schmied
9

Es ist kein einfacher Befehl verfügbar, um die größten Dateien / Verzeichnisse in einem Linux / UNIX / BSD-Dateisystem herauszufinden. Durch die Kombination der folgenden drei Befehle (mithilfe von Pipes) können Sie jedoch leicht die Liste der größten Dateien ermitteln:

# du -a /var | sort -n -r | head -n 10

Wenn Sie eine besser lesbare Ausgabe wünschen, versuchen Sie:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

Wo,

  • Var ist das Verzeichnis, in dem Sie suchen möchten
  • Option du -h Option: Anzeigegrößen in lesbarem Format (z. B. 1K, 234M, 2G).
  • Option du command -s: Zeigt nur eine Summe für jedes Argument an (Zusammenfassung).
  • Option du Befehl -x: Verzeichnisse auf verschiedenen Dateisystemen überspringen.
  • Sortierbefehl -r Option: Kehrt das Ergebnis von Vergleichen um.
  • Sortierbefehl -h Option: Vergleichen Sie lesbare Zahlen. Dies ist nur eine sortenspezifische GNU-Option.
  • Kopfbefehl -10 ODER -n 10 Option: Zeigt die ersten 10 Zeilen an.
Kalpana
quelle
Ich mag den 2. Befehl besser, aber auf osx ist keine -h-Option für die Sortierversion installiert. Sollte für Mac sein: du -hsx * | sort -rn | Kopf -10
Yann VR
1
Ich liebe diesen zweiten Befehl! Das Beste von allen, die ich versucht habe - ich werde es für später speichern.
CodeMouse92
Erklärt den Befehl im Detail klar +1
Harish
8

Dies listet Dateien rekursiv auf, wenn es sich um normale Dateien handelt, sortiert nach dem 7. Feld (das ist die Größe in meiner findAusgabe; überprüfen Sie Ihre) und zeigt nur die erste Datei an.

find . -type f -ls | sort +7 | head -1

Die erste Option findist der Startpfad für die rekursive Suche. Ein Typ der fSuche nach normalen Dateien. Beachten Sie, dass Sie möglicherweise fehlschlagen, wenn Sie versuchen, dies als Dateinamen zu analysieren, wenn der Dateiname Leerzeichen, Zeilenumbrüche oder andere Sonderzeichen enthält. Die Optionen zusort auch je nach Betriebssystem variieren. Ich benutze FreeBSD.

Eine "bessere", aber komplexere und schwerere Lösung wäre, finddie Verzeichnisse zu durchlaufen, aber möglicherweise zu verwenden stat, um die Details der Datei abzurufen, und dann möglicherweise awk, um die größte Größe zu finden. Beachten Sie, dass die Ausgabe von statauch von Ihrem Betriebssystem abhängt.

Ghoti
quelle
1
Was soll der +7Arg tun? Auf meinem Computer beschwert sich sort nur, dass es keine aufgerufene Datei finden kann +7.
Dünen
@Dunes - Wie gesagt, überprüfen Sie die Manpage sortauf Ihrem System. Ich verwende derzeit OS X 10.4, wo die Verwendung von der Sortierung von FreeBSD herrührt : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Beachten Sie die +POS [-POS2]. Dies funktioniert auch in aktuellen Versionen von FreeBSD.
Ghoti
2
Sie haben anscheinend ein anderes Sortierprogramm als ich. Dies ist die Manpage für mein Sortierprogramm - linux.die.net/man/1/sort Damit dies auf meinem Computer funktioniert, müssen Sie das Argument explizit verwenden, -kz. sort -k 7. edit: unter OSX 10.5 scheint sich die Manpage zum Sortieren auf die Version geändert zu haben, die ich habe.
Dünen
1
@Dunes - Es ist alles GNU-Sortierung, aber verschiedene Versionen. Die [+POS1] [-POS2]Notation ist nur eine ältere. Soweit ich das beurteilen kann, wird diese Notation immer noch von der modernen GNU-Sortierung unterstützt, obwohl sie nach meinem Erscheinen nach etwa Version 5.1 von der Sortier-Manpage entfernt worden zu sein scheint. Sie können es in der Manpage zum Sortieren für FreeBSD 4.11 sehen . Ich glaube, ich habe die Manpage von sort seit der Veröffentlichung von FreeBSD 5.0 ​​nicht mehr gelesen!
Ghoti
Beachten Sie außerdem, dass +POS1Sortierparameter von Null und -k POS1von Eins zählen.
Ghoti
6

Hier finden Sie die größte Datei oder den größten Ordner in Ihrem aktuellen Arbeitsverzeichnis:

ls -S /path/to/folder | head -1

So finden Sie die größte Datei in allen Unterverzeichnissen:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'
Steve
quelle
Ich denke, das Standardverhalten von ls besteht darin, Dateien in Spalten aufzulisten (dh mehrere Einträge pro Zeile), sodass die erste nicht genau die größte Datei findet. In Bezug auf Ihren zweiten Befehl wurde nur die größte Datei im angegebenen Verzeichnis gefunden und nicht die Unterverzeichnisse.
Dünen
@Dunes: Sie sind richtig, der erste Befehl könnte Verzeichnisse finden, aber nicht wegen des Standardverhaltens von ls. In meinen Tests -Slistet das Flag eine Datei pro Zeile auf. Ich habe den zweiten Befehl korrigiert. Hoffentlich ist es jetzt voll beweiskräftig. Danke.
Steve
3

Unter Solaris verwende ich:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

oder

find . -type f -ls | sort -nrk7 | head -1 #unformatted

weil alles andere, was hier gepostet wurde, nicht funktioniert hat. Dies findet die größte Datei in $PWDund Unterverzeichnissen.

rindeal
quelle
2

Probieren Sie den folgenden Einzeiler aus (zeigen Sie die 20 größten Dateien an):

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

oder (vom Menschen lesbare Größen):

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Funktioniert unter Linux / BSD / OSX im Vergleich zu anderen Antworten einwandfrei, da die -printfOption find unter OSX / BSD nicht vorhanden ist und statje nach Betriebssystem unterschiedliche Parameter aufweist. Doch der zweite Befehl an der Arbeit auf OSX / BSD richtig (wie sorthat nicht -h), installieren Sie sortvon coreutilsoder Entfernen -hvon lsund verwendet sort -nrstatt.

Diese Aliase sind also nützlich, um sie in Ihren RC- Dateien zu haben:

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'
Kenorb
quelle
Dies zeigt nur den Dateinamen ohne den Pfad an, hilft also nicht wirklich, die größte Datei zu finden.
Schmied
Für mich oben habe ich wirklich die größten Dateien, aber am Ende gibt mir das nicht die richtigen Dateien
Borislav Markov
2

Versuchen Sie folgenden Befehl:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

Dies druckt den größten Dateinamen und die größte Dateigröße und mehr als 500 MB. Sie können das verschieben if($1 > 500000), und es wird die größte Datei im Verzeichnis gedruckt.

zjhui
quelle
1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

oder

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'

Ansgar Wiechers
quelle
0

Dieses Skript vereinfacht das Auffinden der größten Dateien für weitere Aktionen. Ich behalte es in meinem ~ / bin-Verzeichnis und lege ~ / bin in meinen $ PATH.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size
jlettvin
quelle
0

Das ist ganz einfach:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

Und du wirst das bekommen: 8445 examples.desktop

Andrii Kovalchuk
quelle
Was 1***soll am Ende tun? Ich erhalte den Fehler "Keine Übereinstimmungen gefunden" für dieses Argument.
user4815162342
0

Linux-Lösung: Beispielsweise möchten Sie alle Dateien / Ordnerlisten Ihres Home-Verzeichnisses (/) entsprechend der Datei- / Ordnergröße ( absteigende Reihenfolge) anzeigen ) .

sudo du -xm / | sort -rn | Mehr

Monir
quelle
0

So listen Sie die größere Datei in einem Ordner auf

ls -sh /pathFolder | sort -rh | head -n 1

Die Ausgabe von ls -shist eine vergrößerte sund für den Menschen hverständliche Ansicht der Dateigrößenzahl.

Sie könnten verwenden ls -shS /pathFolder | head -n 1. Je größer Saus lsbereits um die Liste von den größeren Dateien zu den kleineren , aber die ersten seine der Summe aller Dateien in diesem Ordner führen. Wenn Sie also nur die größere Datei, eine Datei, auflisten möchten, müssen Sie head -n 2das "Ergebnis der zweiten Zeile" überprüfen oder das erste Beispiel mit verwenden ls sort head.

José Pacheco
quelle
0
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
Borislav Markov
quelle