EDIT: Ich denke, dieser Beitrag ist nicht "nicht besonders nützlich", wie ich dachte, es war. Dies ist eine sehr schnelle Lösung, die nur den Überblick über die zuletzt geänderte Datei behält (anstatt die gesamte Liste der Dateien zu sortieren):
find . -type f -printf '%T@ %p\n' | awk 'BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; } { if ($1 > mostrecenttime) { mostrecenttime = $1; mostrecentline = $0; } } END { print mostrecentline; }' | cut -f2- -d ' '
Um die Übersichtlichkeit zu gewährleisten, sollten Sie die Informationen wie folgt auf mehrere Zeilen verteilen:
find . -type f -printf '%T@ %p\n' | awk '
BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; }
{
if ($1 > mostrecenttime)
{ mostrecenttime = $1; mostrecentline = $0; }
}
END { print mostrecentline; }' | cut -f2- -d ' '
Ende der Bearbeitung
Kein besonders nützlicher Beitrag, aber da bei 'Anordnen' die Geschwindigkeit diskutiert wurde, dachte ich, ich würde dies teilen.
Bei den Lösungen von arrang und enzotib werden alle Dateien im Verzeichnis mit ihren MTimes aufgelistet und anschließend sortiert. Wie Sie wissen, ist das Sortieren nicht erforderlich, um das Maximum zu finden. Das Maximum kann in linearer Zeit ermittelt werden, aber das Sortieren dauert n log (n) [Ich weiß, der Unterschied ist nicht viel, aber dennoch;)]. Ich kann mir keine saubere Art und Weise vorstellen, dies umzusetzen. [BEARBEITEN: Eine ordentliche (wenn auch schmutzig aussehende) und schnelle Implementierung, die oben bereitgestellt wurde.]
Nächstbeste Sache - Um die zuletzt bearbeitete Datei in einem Verzeichnis zu finden, suchen Sie rekursiv die zuletzt bearbeitete Datei in jedem Unterverzeichnis der Ebene 1. Lassen Sie diese Datei das Unterverzeichnis darstellen. Sortieren Sie nun die Dateien der Ebene 1 zusammen mit den Vertretern der Unterverzeichnisse der Ebene 1. Wenn die Anzahl der Dateien und Unterverzeichnisse der Ebene 1 in jedem Verzeichnis nahezu konstant ist, sollte dieser Prozess linear mit der Gesamtzahl der Dateien skaliert werden.
Das habe ich mir ausgedacht, um das umzusetzen:
findrecent() { { find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1; }
findrecent .
Ich habe dies ausgeführt und eine Reihe von find: findrecent: No such file or directory
Fehlern erhalten. Grund: -exec of find läuft in einer anderen Shell. Ich habe versucht, findrecent in .bashrc, .xsessionrc zu definieren, aber dies hat nicht geholfen. Am Ende bin ich zum Putten übergegangen
#!/bin/bash
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
in einem Skript findrecent
in meinem Pfad aufgerufen und dann ausgeführt.
Ich ließ dies laufen, wartete und wartete ohne Ausgabe. Nur um sicherzugehen, dass ich mich nicht mit Endlosschleifen befasst habe, auf die ich die Datei geändert habe
#!/bin/bash
echo "$1" >&2
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
und versuchte es erneut. Es hat funktioniert - aber 1 Minute 35 Sekunden auf meinem Homefolder gedauert - Arrangements und Enzotibs Lösungen haben 1,69 bzw. 1,95 Sekunden gedauert!
Soviel zur Überlegenheit von O (n) gegenüber O (n log (n))! Verdammt du Funktionsaufruf Overhead! [Oder vielmehr Skriptaufruf Overhead]
Aber dieses Skript lässt sich besser skalieren als die früheren Lösungen, und ich wette, es wird auf der Speicherbank von Google schneller laufen als sie. D