it-swarm.com.de

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

Wir beginnen gerade eine UNIX-Klasse und lernen verschiedene Bash-Befehle. Unsere Aufgabe besteht darin, verschiedene Befehle in einem Verzeichnis auszuführen, in dem sich auch mehrere Ordner befinden. 

Ich kann alle regulären Dateien aus dem Stammordner auflisten und zählen: 

find . -type l | wc -l

Aber ich würde gerne wissen, wohin ich gehen soll, um die größte Datei im gesamten Verzeichnis zu finden. Ich habe einige Dinge bezüglich eines du-Befehls gesehen, aber das haben wir nicht gelernt, also gehe ich davon aus, dass wir im Repertoire der Dinge, die wir gelernt haben, es irgendwie mit dem ls -t-Befehl verbinden müssen.

Und entschuldigen Sie mich, wenn meine "Sprache" nicht korrekt ist, gewöhne ich mich immer noch daran!

91
Rekson

Zitat aus diesem link-

Wenn Sie die 10 größten Dateinamen (nicht -Verzeichnisse) in einem bestimmten Verzeichnis und dessen 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 finden.

$ 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 "Kopfes", um die obersten X-größten Dateien zu drucken (in allen obigen Beispielen)

117
tamsler

So finden Sie die Top 25-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 durch Sortieren nach der Größe der Dateien mit dem Pipe-Befehl "sort -nr -k5" ausgegeben.

Gleiche aber mit menschenlesbaren Dateigrößen:

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

56
xpros
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 wünschen:

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

Dadurch wird die Verwendung von awk vermieden, und Sie können die in ls gewünschten Flags verwenden.

Vorbehalt . Da xargs versucht, überlange Befehlszeilen zu erstellen, schlägt dies möglicherweise fehl, wenn Sie es in einem Verzeichnis mit vielen Dateien ausführen, da ls mehr als einmal ausgeführt wird. Dies ist kein unüberwindbares Problem (Sie können die head -n 1-Ausgabe von jedem ls-Aufruf abrufen und erneut ls -S ausführen, wobei eine Schleife ausgeführt wird, bis Sie eine einzige Datei haben).

10
nneonneo

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

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

Die erste Option für find ist der Startpfad für die rekursive Suche. Ein Typ von f sucht nach normalen Dateien. Wenn Sie versuchen, dies als Dateinamen zu analysieren, schlagen Sie möglicherweise fehl, wenn der Dateiname Leerzeichen, Zeilenumbrüche oder andere Sonderzeichen enthält. Die Optionen für sort variieren ebenfalls je nach Betriebssystem. Ich benutze FreeBSD.

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

8
ghoti

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 die Liste der größten Dateien leicht ermitteln:

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

Wenn Sie eine für Menschen lesbare Ausgabe wünschen, versuchen Sie Folgendes:

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

Woher,

  • Var ist das Verzeichnis, das Sie suchen möchten
  • du-Befehl -h-Option: Anzeigegrößen in für Menschen lesbarem Format (z. B. __K, 234M, 2G) 
  • du Kommando -s Option: Zeigt nur eine Summe für jedes Argument (Zusammenfassung) an. 
  • du-Befehl Option -x: Überspringen von Verzeichnissen auf verschiedenen Dateisystemen. 
  • Sortierbefehl -r-Option: Umgekehrt das Ergebnis der Vergleiche. 
  • Sortierbefehl -h-Option: Vom Menschen lesbare -Nummern vergleichen. Dies ist nur die sortierungsspezifische Option GNU. 
  • Kopfbefehl -10 OR -n 10 Option: Zeigt die ersten 10 Zeilen an.
7
Kalpana

Dadurch wird die größte Datei oder der größte Ordner in Ihrem aktuellen Arbeitsverzeichnis gefunden:

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 }'
6
Steve

Bei 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 . Dadurch wird die größte Datei in $PWD und Unterverzeichnissen gefunden.

3
rindeal

Versuchen Sie den 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 

Dadurch werden der größte Dateiname und die Größe sowie mehr als 500 MB gedruckt. Sie können die if($1 > 500000) verschieben und die größte Datei im Verzeichnis drucken.

2
zjhui

Versuchen Sie den folgenden Einzeiler (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 gut, da die -printf-Option von find unter OSX/BSD nicht vorhanden ist und stat je nach Betriebssystem unterschiedliche Parameter hat. Der zweite Befehl, um unter OSX/BSD ordnungsgemäß zu arbeiten (da sort keinen -h hat), installieren Sie sort von coreutils oder entfernen -h von ls und verwenden stattdessen sort -nr.

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'
2
kenorb

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

Sudo du -xm/| sort -rn | Mehr

1
Monir

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

oder

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

1
Ansgar Wiechers

Dieses Skript vereinfacht das Suchen größter Dateien für weitere Aktionen. Ich behalte es in meinem Verzeichnis ~/bin und füge ~/bin in meinen $ PATH ein.

#!/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
0
jlettvin

Um die größere Datei in einem Ordner aufzulisten 

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

Die Ausgabe von ls -sh ist eine nach Größe sortierte s und menschliche h verständliche Ansicht der Dateigrößenummer. 

Sie könnten ls -shS /pathFolder | head -n 1 verwenden. Der größere S von ls ordnet die Liste bereits von den größeren Dateien zu den kleineren Dateien an, aber das erste Ergebnis ist die Summe aller Dateien in diesem Ordner. Wenn Sie also nur die größere Datei auflisten möchten, eine Datei, müssen Sie head -n 2 und das Ergebnis der zweiten Zeile überprüfen oder das erste Beispiel mit ls sort head verwenden. 

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

Das ist ein ganz einfacher Weg:

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

Und du bekommst das: 8445 examples.desktop