EDIT: Je suppose que ce post n'est pas "pas particulièrement utile" comme je le pensais. C'est une solution très rapide qui ne fait que garder trace du dernier fichier modifié (au lieu de trier la liste complète des fichiers):
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 ' '
Réparti sur plusieurs lignes pour plus de clarté, il se présente comme suit:
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 ' '
Fin de l'EDIT
Ce message n’est pas particulièrement utile, mais comme «organiser» parle de vitesse, j’ai pensé partager cela.
Les solutions de arrange et de enzotib impliquent de lister tous les fichiers du répertoire avec leurs heures, puis de les trier. Comme vous le savez, le tri n’est pas nécessaire pour trouver le maximum. Trouver le maximum peut être fait en temps linéaire mais le tri prend n log (n) temps [Je sais que la différence n’est pas grande, mais quand même;)]. Je ne peux pas penser à un moyen élégant de mettre cela en œuvre. [EDIT: Une mise en œuvre soignée (bien que sale) et rapide fournie ci-dessus.]
Meilleure chose à faire - Pour rechercher le fichier le plus récemment édité dans un répertoire, recherchez récursivement le fichier le plus récemment édité dans chaque sous-répertoire de niveau 1. Laissez ce fichier représenter le sous-répertoire. Maintenant, triez les fichiers de niveau 1 avec les représentants des sous-répertoires de niveau 1. Si le nombre de fichiers de niveau 1 et de sous-répertoires de chaque répertoire est presque constant, le processus doit évoluer de manière linéaire avec le nombre total de fichiers.
Voici ce que je suis venu avec pour implémenter ceci:
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 .
J'ai couru cela et j'ai eu un tas d' find: findrecent: No such file or directory
erreurs. Raison: -exec de la recherche s'exécute dans un shell différent. J'ai essayé de définir findrecent dans .bashrc, .xsessionrc mais cela n'a pas aidé [j'apprécierais l'aide ici]. Finalement, j'ai eu recours à
#!/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;
dans un script appelé findrecent
dans mon PATH, puis en l'exécutant.
J'ai couru ceci, continuais d'attendre et d'attendre sans sortie. Juste pour être sûr que je n'avais pas affaire à des boucles infinies, j'ai modifié le fichier en
#!/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;
et essayé à nouveau. Cela a fonctionné - mais cela a pris 1 minute 35 secondes sur mon homefolder - les solutions d'Arange et enzotib ont pris respectivement 1,69 et 1,95 secondes!
Voilà pour la supériorité de O (n) sur O (n log (n))! Bon sang, vous appelez des frais généraux [Ou plutôt appel overhead]
Mais ce script est plus performant que les solutions précédentes et je parie qu'il s'exécutera plus rapidement que sur la mémoire de google; D