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!
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)
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
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).
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.
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,
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 }'
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.
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.
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 undstat
je nach Betriebssystem unterschiedliche Parameter hat. Der zweite Befehl, um unter OSX/BSD ordnungsgemäß zu arbeiten (dasort
keinen-h
hat), installieren Siesort
voncoreutils
oder entfernen-h
vonls
und verwenden stattdessensort -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'
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
du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1
oder
du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'
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
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.
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
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