Listet Dateien, die größer als {size} sind, nach Datum sortiert auf

27

Ich möchte das Problem lösen, indem ich die 10 aktuellsten Dateien im aktuellen Verzeichnis mit mehr als 20 MB aufführe.

Mit lskann ich machen:

ls -Shal |head

um die 10 größten Dateien zu erhalten, und:

ls -halt |head

um die 10 neuesten Dateien zu erhalten

Mit find kann ich:

find . -size +20M

Zum Auflisten aller Dateien über 20 MB im aktuellen Verzeichnis (und Unterverzeichnissen, die ich nicht möchte).

Gibt es eine Möglichkeit, die zehn aktuellsten Dateien einer bestimmten Größe aufzulisten, vorzugsweise mit ls?

EoghanM
quelle

Antworten:

24

Die Option 'aktuelles Verzeichnis' für findist -maxdepth 1. Die gesamte Befehlszeile für Ihre Anforderungen lautet:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

oder

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head
Rajish
quelle
8

Hinweis: Dies funktioniert für GNU-find, aber nicht für jeden anderen Fund.

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

Beginnt wie @Rajish, verwendet jedoch den printfBefehl from find, um das Ausgabeformat anzugeben. Es gibt 3 zeitbezogene Formate: atime, ctime und mtime - %Tgilt für mtime %Aund %Cfür die anderen Formate.

@Gibt das Zeitformat in Sekunden seit der Epoche an. %fsteht für den Dateinamen, \nfür einen Zeilenumbruch zwischen 2 Dateien.

Wenn Sie dann in umgekehrter Reihenfolge nach der Nummer sortieren, erhalten Sie zuerst die jüngsten Dateien, und wir nehmen 20 Zeilen¹ mit head.

Am Ende sedwird verwendet, um die Zeitinformationen wegzuwerfen.

¹) Da headzeilenweise gearbeitet wird, kann eine einzelne Datei mit mehr als 20 Zeilenumbrüchen im Namen, was etwas ungewöhnlich, aber nicht verboten ist, die Ausgabe verfälschen, wenn sie zu den ersten 20 Übereinstimmungen gehört. Wenn Sie solche Dateien haben, versuchen Sie bitte, sie zu entfernen, um ihren Namen zu ändern. Sie sind häufig ein Problem für einfache Skripte.

Benutzer unbekannt
quelle
1
Wenn Sie file‚s -lsBefehl, werden die Sonderzeichen als Backslash-Escape - Zeichen gedruckt werden: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Außerdem sieht das Format so aus ls -l, als hätte EoghanM auch -lsowieso angegeben .
Manatwork
printffunktioniert nur für bestimmte GNU-Distributionen.
Brethlosze
%T+generiert vom Menschen lesbare Zeitstempel, 2018-11-06+13:37:54.4606466460die auch nach sort(ohne -n) sortiert werden können
Ciro Santilli am
5

Zshs Glob-Qualifikanten machen dies einfach. Das .Qualifikationsmerkmal wählt nur reguläre Dateien aus und Lm+20wählt Dateien aus, die mindestens 20 MB plus 1 Byte lang sind. Verwenden Sie diese Option, um Dateien mit einer Länge von genau 20 MB einzuschließen L+20971519. Dann omsortiert die durch Modifikation der Zeit abnehmen, und [1,10]begrenzt die Erweiterung auf die ersten 10 Übereinstimmungen. Sie benötigen weiterhin die -tOption, lsum die Dateien nach Datum aufzulisten. oder Sie können die Dateien an einen anderen Befehl übergeben (jüngster zuerst). Um die Dateien zuerst an einen anderen Befehl mit der ältesten Datei Omzu übergeben, sortieren Sie sie nach der Änderungszeit und [-10,-1]extrahieren Sie die letzten 10 Übereinstimmungen.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])
Gilles 'SO - hör auf böse zu sein'
quelle
2

Ich denke, das könnte ein besserer Weg sein, um das Problem zu lösen ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

Um Fehler bei der Suche zu beseitigen, versuchen Sie, auf Dateien zuzugreifen, für die Sie keine Leseberechtigung haben. Fügen Sie diese möglicherweise hinzu

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 
Dominic Williams
quelle
1

Dies druckt nur die angegebenen 10 Dateien, unabhängig von eingebetteten Zeilenumbrüchen in Dateinamen. Es verwendet Dateisysteminodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done
Peter.O
quelle
-1

Danke für alle Antworten. Für was ich gegangen bin, ist das folgende:

ls -halt | grep "M " |head

Obwohl die 20 Megabyte zugunsten von mehr als einem Megabyte (und weniger als einem Gigabyte) weggelassen werden, ist es leicht zu merken und bewahrt das für den Menschen lesbare Element der Dateigrößen.

EoghanM
quelle
4
Sie sollten nicht versuchen, die Ausgabe von zu analysieren ls, es zeigt Ihnen eine Darstellung von Dateien, nichts weiter. Bei einfachen Dateinamen entspricht die Ausgabe meistens dem Dateinamen, Sie sollten sich jedoch nicht darauf verlassen.
Chris Down
Ich bin mir sicher, dass dies in Bezug auf einen menschlichen Benutzer (und die Ausgabe, die nicht an eine andere Stelle weitergeleitet wird) leichter zu merken ist, da es mit bekannten einfachen Tools einfacher zusammengestellt werden kann. Tldp.org/LDP/GNU-Linux- Tools-Summary / html / c1089.htm
EoghanM