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?

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

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.


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])

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 

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

-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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.