Wie liste ich Dateien rekursiv auf und sortiere sie nach Änderungszeit?

13

Wie liste ich alle Dateien in einem Verzeichnis rekursiv auf und sortiere die Ausgabe nach Änderungszeit?

Normalerweise verwende ich, ls -lhtcaber es werden nicht alle Dateien rekursiv gefunden. Ich benutze Linux und Mac.

ls -l unter Mac OS X kann geben

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c

Wenn der Datumsteil nicht konsistent oder ausgerichtet ist, muss eine Lösung dies berücksichtigen.

Teillösung

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-

funktioniert, aber nicht rekursiv.

qazwsx
quelle
Ich gehe davon aus, dass Sie unter Linux arbeiten, aber Sie sollten Ihr Betriebssystem entweder in der Frage oder vorzugsweise als Tag explizit angeben.
EBGreen

Antworten:

2

Hier ist eine Methode, die statwie von @ johnshen64 vorgeschlagen verwendet wird

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-
Computist
quelle
find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2-würde nur die absoluten Pfade der Dateien unter OS X
drucken.
Welche Version von verwenden statSie? Ihr Format oben hat bei mir nicht funktioniert. Ich musste folgendes verwenden : find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-. Dies ist mitstat (GNU coreutils) 8.23
user84207
12

Verwenden Sie find's -printfund sortieren Sie nach einem angemessenen Datumsformat:

find -type f -printf '%T+\t%p\n' | sort -n

Dies sollte Prozessgabeln minimieren und somit am schnellsten sein.

Beispiele, wenn Ihnen der zweite Teil nicht gefällt (der im Dateisystem oft ohnehin nicht implementiert ist):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n

EDIT: Standard findauf Mac hat nicht -printf. Es ist jedoch nicht schwierig, GNU find auf einem Mac zu installieren (siehe auch diesen Link für weitere Einschränkungen bezüglich der Mac / Linux-Kompatibilität und xargs).

Daniel Andersson
quelle
0

find .sollte in der Lage sein, alle Dateien zu erhalten. Etwas wie das:

find . -exec ls -dl '{}' \; | sort -k 6,7

Sie müssen es auf Ihre Bedürfnisse abstimmen.

johnshen64
quelle
Ich gehe auch davon aus, dass es sich um Linux handelt, wie EBGreen sagte. Es ist ein Alias ​​in Windows PS. Sie müssen also ein Sortierobjekt verwenden und untergeordnete Elemente rekursiv abrufen, wenn dies der Fall ist, aber die Idee ist dieselbe.
Johnshen64
Funktioniert es auf dem Mac wirklich richtig, wenn die Daten manchmal den Jahresteil verfehlen?
Qazwsx
Wenn Sie Recht haben, wird die Datumsanzeige für die letzten Dateien die Dinge durcheinander bringen. Sie müssen stattdessen stat verwenden, um in diesem Fall das genau formatierte Datum zu erhalten. Meine Dateien sind alle sehr alt, daher hat der Befehl
einwandfrei funktioniert.
@ johnshen64: Unter lsLinux können Sie mit einer --time-formatOption sicherstellen, dass sowohl aktuelle als auch ältere Dateidaten im selben Format angezeigt werden.
RedGrittyBrick
ah danke, du hast recht, hab das einfach nicht benutzt. das ist viel einfacher als stat zu verwenden. es heißt --time-style, denke ich.
Johnshen64
0

Diese Antwort auf eine ähnliche Frage auf der Unix Stack Exchange-Site hat mir geholfen, weil ich zsh verwendet habe:

So listen Sie Dateien rekursiv nach Änderungsdatum sortiert auf (kein stat-Befehl verfügbar!)

Brad Parks
quelle
Dies ist wirklich ein Kommentar und keine Antwort auf die ursprüngliche Frage. Sie können jederzeit Ihre eigenen Beiträge kommentieren. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren . Bitte lesen Sie Warum brauche ich 50 Ruf, um zu kommentieren? Was kann ich stattdessen tun?
DavidPostill