Es scheint, dass ls
die Dateien bei einem rekursiven Aufruf nicht richtig sortiert werden:
ls -altR . | head -n 3
Wie finde ich die zuletzt geänderte Datei in einem Verzeichnis (einschließlich Unterverzeichnissen)?
bash
filesystems
find
JMW
quelle
quelle
Antworten:
Für einen riesigen Baum könnte es schwierig sein
sort
, alles im Gedächtnis zu behalten.%T@
gibt Ihnen die Änderungszeit wie ein Unix-Zeitstempel,sort -n
sortiert numerisch,tail -1
nimmt die letzte Zeile (höchster Zeitstempel) undcut -f2 -d" "
schneidet das erste Feld (den Zeitstempel) von der Ausgabe ab.Bearbeiten: Genau wie
-printf
es wahrscheinlich nur GNU ist, ist auch Ajreals Verwendung vonstat -c
. Obwohl es möglich ist, dasselbe mit BSD zu tun, sind die Formatierungsoptionen unterschiedlich (wie-f "%m %N"
es scheint).Und ich habe den Teil des Plural verpasst; Wenn Sie mehr als die neueste Datei möchten , erhöhen Sie einfach das Argument tail.
quelle
sort -rn | head -3
anstelle von wechselnsort -n | tail -3
. Eine Version gibt die Dateien vom ältesten zum neuesten, während die andere vom neuesten zum ältesten wechselt.sort
erstellt/tmp
nach Bedarf temporäre Dateien (in ), daher denke ich nicht, dass dies ein Problem ist.-printf '%T@ %Tb %Td %TY %p\n'
geben Ihnen einen Datumsstempel (falls erforderlich) (ähnlichls
)find . -type f -printf '%TF %TT %p\n' | sort | tail -1
Nach der Antwort von @ plundra finden Sie hier die BSD- und OS X-Version:
quelle
find
Unterstützt das BSD / OS X+
statt\;
? Denn das macht dasselbe (mehrere Dateien als Parameter übergeben), ohne die-print0 | xargs -0
Pipe.head -1
zuhead -5
Anstatt die Ergebnisse zu sortieren und nur die zuletzt geänderten beizubehalten, können Sie mit awk nur das Ergebnis mit der größten Änderungszeit (in Unix-Zeit) drucken:
Dies sollte ein schnellerer Weg sein, um Ihr Problem zu lösen, wenn die Anzahl der Dateien groß genug ist.
Ich habe das NUL-Zeichen (dh '\ 0') verwendet, da ein Dateiname theoretisch jedes beliebige Zeichen (einschließlich Leerzeichen und Zeilenumbruch) enthalten kann.
Wenn Sie keine solchen pathologischen Dateinamen in Ihrem System haben, können Sie auch das Zeilenumbruchzeichen verwenden:
Darüber hinaus funktioniert dies auch in Mawk.
quelle
mawk
der Debian-Standardalternative.Ich hatte Probleme, die zuletzt geänderte Datei unter Solaris 10 zu finden. Es
find
gibt keineprintf
Option und siestat
ist nicht verfügbar. Ich habe die folgende Lösung gefunden, die für mich gut funktioniert:Um auch den Dateinamen anzuzeigen, verwenden Sie
Erläuterung
find . -type f
findet und listet alle Dateien aufsed 's/.*/"&"/'
Umschließt den Pfadnamen in Anführungszeichen, um Leerzeichen zu verarbeitenxargs ls -E
Wenn der angegebene Pfad an gesendet wird,ls
stellt die-E
Option sicher, dass ein vollständiger Zeitstempel (Format Jahr-Monat-Tag Stunde-Minute-Sekunden-Nanosekunden ) zurückgegeben wirdawk '{ print $6," ",$7 }'
extrahiert nur Datum und Uhrzeitawk '{ print $6," ",$7," ",$9 }'
extrahiert Datum, Uhrzeit und Dateinamensort
Gibt die nach Datum sortierten Dateien zurücktail -1
Gibt nur die zuletzt geänderte Datei zurückquelle
Dies scheint auch mit Unterverzeichnissen gut zu funktionieren:
Bei zu vielen Dateien verfeinern Sie den Fund.
quelle
-l
Option zuls
erscheint unnötig. Scheint einfach-tr
ausreichend.find . -type f -print0 | xargs -0 ls -ltr | tail -n 1
Zeigt die neueste Datei mit lesbarem Zeitstempel an:
Ergebnis sieht so aus:
Um mehr Dateien anzuzeigen, ersetzen Sie diese
-n1
durch eine höhere Nummerquelle
Ich verwende ständig etwas Ähnliches sowie die Top-K-Liste der zuletzt geänderten Dateien. Bei großen Verzeichnisbäumen kann es viel schneller sein, eine Sortierung zu vermeiden . Im Fall der zuletzt geänderten Top-1-Datei:
In einem Verzeichnis mit 1,7 Millionen Dateien erhalte ich das neueste in 3.4s, eine Beschleunigung von 7.5x gegenüber der 25.5s-Lösung mit sort.
quelle
lastfile
) und dann mit dem Ergebnis tun, was Sie möchten, z. B.ls -l $(lastfile .)
oderopen $(lastfile .)
(auf einem Mac) usw.Dies ergibt eine sortierte Liste:
Kehren Sie die Reihenfolge um, indem Sie im Sortierbefehl ein '-r' einfügen. Wenn Sie nur Dateinamen möchten, geben Sie "awk '{print $ 11}' |" ein. vor '| Kopf'
quelle
Unter Ubuntu 13 funktioniert dies im Folgenden möglicherweise etwas schneller, da die Sortierung umgekehrt wird und "Kopf" anstelle von "Schwanz" verwendet wird, wodurch die Arbeit reduziert wird. So zeigen Sie die 11 neuesten Dateien in einem Baum an:
finden . -Typ f -printf '% T @% p \ n' | sort -n -r | Kopf -11 | cut -f2- -d "" | sed -e 's, ^. / ,,' | xargs ls -U -l
Dies ergibt eine vollständige ls-Liste ohne erneutes Sortieren und lässt das nervige './' weg, das 'find' auf jeden Dateinamen setzt.
Oder als Bash-Funktion:
Der größte Teil der Arbeit wurde jedoch mit der ursprünglichen Lösung von plundra erledigt. Danke plundra.
quelle
Ich stand vor dem gleichen Problem. Ich muss die neueste Datei rekursiv finden. Die Suche dauerte ungefähr 50 Minuten.
Hier ist ein kleines Skript, um es schneller zu machen:
Es ist eine rekursive Funktion, die das zuletzt geänderte Element eines Verzeichnisses abruft. Wenn es sich bei diesem Element um ein Verzeichnis handelt, wird die Funktion rekursiv aufgerufen und in diesem Verzeichnis usw. gesucht.
quelle
Ich finde folgendes kürzer und mit besser interpretierbarer Ausgabe:
Angesichts der festen Länge der standardisierten Datumszeiten im ISO-Format ist die lexikografische Sortierung in Ordnung und wir benötigen keine
-n
Option für die Sortierung.Wenn Sie die Zeitstempel wieder entfernen möchten, können Sie Folgendes verwenden:
quelle
Wenn das Ausführen
stat
jeder einzelnen Datei zu langsam ist, können Sie diexargs
Dinge etwas beschleunigen:quelle
Dadurch wird die Änderungszeit aller Verzeichnisse im aktuellen Verzeichnis rekursiv in die neueste Datei in jedem Verzeichnis geändert:
quelle
Diese einfache Cli wird auch funktionieren:
Sie können -1 in die Anzahl der Dateien ändern, die Sie auflisten möchten
quelle
Ich fand den obigen Befehl nützlich, aber für meinen Fall musste ich auch das Datum und die Uhrzeit der Datei sehen. Ich hatte ein Problem mit mehreren Dateien, deren Namen Leerzeichen enthalten. Hier ist meine Arbeitslösung.
quelle
Der folgende Befehl funktionierte unter Solaris:
quelle
Versteckte Dateien ignorieren - mit schönem und schnellem Zeitstempel
Ergebnis
Behandelt Leerzeichen in Dateinamen gut - nicht, dass diese verwendet werden sollten!
Mehr
Mehr in
find
Hülle und Fülle folgen Sie dem Link.quelle
So suchen Sie nach Dateien in / target_directory und allen Unterverzeichnissen, die in den letzten 60 Minuten geändert wurden:
So finden Sie die zuletzt geänderten Dateien in umgekehrter Reihenfolge der Aktualisierungszeit (dh zuerst die zuletzt aktualisierten Dateien):
quelle
Ich bevorzuge dieses, es ist kürzer:
quelle
Ich habe ein Pypi / Github-Paket für diese Frage geschrieben, weil ich auch eine Lösung brauchte.
https://github.com/bucknerns/logtail
Installieren:
Verwendung: Schwänze geänderte Dateien
Verwendung2: Öffnet die zuletzt geänderte Datei im Editor
quelle