Suchen Sie nach Dateien, die älter als X Tage sind, und geben Sie sie nach ihrer Größe aus

8

Ich versuche, die Dateien älter als einige Tage zu machen und sie in absteigender Reihenfolge aufzulisten, basierend auf ihrer Größe mit all ihren Informationen (Größe, vollständiger Pfad usw. - etwas Ähnliches, das von bereitgestellt wird ls).

Während ich in der Lage bin, ältere Dateien zu finden mit:

find . -mtime +10

Ich kann die gewünschten Informationen nicht auflisten.

user148335
quelle
Bitte fügen Sie Ihre Distribution und Shell-Informationen hinzu
lesen Sie den
@lese: AIX 6.1; während echo $ SHELL -> / usr / bin / ksh
user148335
Das klingt wie ein XYProblem ... brauchen Sie wirklich, wie Sie fragen, ALLE Dateien nach Größenreihenfolge? oder suchen Sie (wahrscheinlicher) nach "alten" (> 10 Tage) Dateien, die groß genug sind, und benötigen beispielsweise nur die 200 größten, um dann zu entscheiden, welche davon Sie löschen können, um Platz zu sparen?. Im letzteren Fall und da Sie unter AIX sind und möglicherweise keine Gnu-Tools haben, ist eine Kombination aus Suchen (Ausgabe aller Dateien> 10 Tage) und awk (Beibehalten der 200 größten Dateien in einem Array und anschließende Ausgabe in der richtigen Reihenfolge) Ihre beste Wette
Olivier Dulac

Antworten:

8

Vorausgesetzt, Ihre Dateipfade enthalten keine Zeilenumbrüche:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

Siehe findHandbuch , Abschnitt Actions.

  • %s Dateigröße in Bytes.
  • %n Anzahl der Hardlinks zur Datei.
  • %m Berechtigungsbits der Datei ( oktal ).
  • %u Benutzername der Datei oder numerische Benutzer-ID, wenn der Benutzer keinen Namen hat.
  • %g Gruppenname der Datei oder numerische Gruppen-ID, wenn die Gruppe keinen Namen hat.
  • %t Die letzte Änderungszeit der Datei in dem von der C- ctimeFunktion zurückgegebenen Format .
  • %p Dateiname.
  • %l Objekt der symbolischen Verknüpfung (leere Zeichenfolge, wenn die Datei keine symbolische Verknüpfung ist).

Übrigens: Beachten Sie, dass im POSIX- find Handbuch die meisten der oben genannten Aktionen nicht angegeben sind.

patryk.beza
quelle
1
Es heißt: find: 0652-017 -printf ist keine gültige Option.
user148335
für mich funktioniert das und scheint eine ziemlich saubere Lösung zu sein +1
lese
@ user148335, Sie haben nicht erwähnt, welche Linux-Distribution Sie ausführen. Es scheint, dass Sie auf die POSIX-Suchspezifikation beschränkt sind , die ziemlich begrenzt ist.
patryk.beza
1
@ patryk.beza Ich denke, Sie haben mit user148335 gesprochen
lese
AIX 6.1; während echo $ SHELL -> / usr / bin / ksh
user148335
4

Dieser Befehl verwendet nur POSIX-Funktionen von findund von ls:

find . -type f -mtime +10 -exec ls -lS {} +

Es kann jedochls mehrmals aufgerufen werden, wenn sich im aktuellen Verzeichnis (oder in den Unterverzeichnissen rekursiv) eine sehr große Anzahl von Dateien befindet, die mit dem -mtime +10primären Verzeichnis übereinstimmen .

Wenn es lsmehr als einmal aufgerufen wird, wird die Sortierung natürlich nur innerhalb jeder lsAusführung durchgeführt, nicht über mehrere Ausführungen hinweg.

Bei einer angemessenen Anzahl von Dateien ist dies wahrscheinlich die beste Wahl.

Miguel G.
quelle
Die aktualisierte Version bricht nicht mit Leerzeichen im Namen
Miguel G
1
Wenn lsnur ein Argument übergeben wird, kann es nur wenig sortiert werden. Mit +statt ;wäre das besser, lskönnte aber trotzdem mehrmals aufgerufen werden, wenn es viele Dateien gibt.
Stéphane Chazelas
2
Dies ist der genaue Befehl, den ich gegeben hätte, also habe ich den erklärenden Text hinzugefügt, den ich dazu gegeben hätte.
Wildcard
3

Mit zsh:

ls -ldrS -- **/*(m+10)

Oder um die doppelte Sortierung zu vermeiden (nach Name nach zsh und nach Größe nach ls):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

oder (wenn Ihre lsUnterstützung -Ufür unsortiert):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

Fügen Sie das DGlob-Qualifikationsmerkmal hinzu, damit Sie auch versteckte Dateien sehen können.

Stéphane Chazelas
quelle
Funktioniert dies, wenn Benutzer- und Gruppennamen Leerzeichen enthalten?
Roaima
@roaima, ja. Warum sollte es nicht? Es kann für E2BIG brechen, das Sie mithilfe von umgehen können zargs.
Stéphane Chazelas
Da Sie es zur Verfügung gestellt haben, habe ich vermutet, dass es in Ordnung sein würde, aber ich musste fragen :-)
Roaima
1

Ich denke, Sie könnten etwas Ähnliches tun wie:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'\0' line; do
    #echo "$line"
    ls -lS "$line"    
done

Beachten Sie die -SParameter des lsBefehls:

-S sortieren nach Dateigröße

lese
quelle
Nach dem Löschen von -d $ '\ 0' aufgrund der folgenden Meldung: $ \ 0: Dies ist kein Bezeichner, für den ich die Ausgabe erhalten habe, aber die Dateien werden aufgrund ihrer Größe nicht absteigend geschrieben
user148335
Wird unterbrochen, wenn Sie auf ein Verzeichnis unter stoßen /home/phphil. Versuchen Siels -ld ...
Roaima
@ Roaima, was ist find . -type fstattdessen zu verwenden?
Lesen
@lese Ich habe den Code geändert, aber der Befehl scheint zweimal jede Datei aus jedem Unterordner zu werfen. Ex.
user148335
find ... -type fwürde funktionieren, ebenso wie das Hinzufügen der -dFlagge zuls
Roaima
1

Versuche dies:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g
dervishe
quelle
Mit der Option -n, dann ist es kein Problem , weil ls nicht Liste Benutzernamen und Gruppennamen aber uid und gid statt
dervishe
0

Für einen einfacheren Einzeiler können Sie die findOption verwenden -ls. In den meisten Fällen befindet sich die Dateigröße in der siebten Spalte der aufgelisteten Informationen (ändern Sie sie 7gegebenenfalls am Ende des Befehls, falls nicht):

find . -type f -mtime +10 -ls | sort -n -r -k7
Holzgott
quelle
0

Eine andere Variante wäre:

  • find (um die passenden Dateien zu finden)
  • du (um die Dateigröße in KB anzuzeigen)
  • sort -n -r (zu kurz in absteigender Reihenfolge)

Hier ist der Befehl:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
Stephen Quan
quelle