EDITAR: Supongo que esta publicación no es "no particularmente útil" como pensé que era. Esta es una solución realmente rápida que solo realiza un seguimiento del archivo modificado más recientemente (en lugar de ordenar la lista completa de archivos):
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 ' '
Repartidas en varias líneas para mayor claridad, se ve de la siguiente manera:
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 EDITAR
No es una publicación particularmente útil, pero dado que 'organizar' estaba discutiendo la velocidad, pensé en compartir esto.
Las soluciones del arreglo y enzotib implican enumerar todos los archivos dentro del directorio con sus mtimes y luego ordenarlos. Como sabes, no es necesario ordenar para encontrar el máximo. Encontrar el máximo se puede hacer en tiempo lineal, pero la clasificación lleva n tiempo log (n) [Sé que la diferencia no es mucha, pero aún así;]]. No puedo pensar en una forma ordenada de implementar esto. [EDITAR: Una implementación ordenada (aunque sucia) y rápida proporcionada anteriormente.]
Siguiente mejor opción: para buscar el archivo editado más recientemente en un directorio, busque recursivamente el archivo editado más recientemente en cada subdirectorio de nivel 1. Deje que este archivo represente el subdirectorio. Ahora ordene los archivos de nivel 1 junto con los representantes de los subdirectorios de nivel 1. Si el número de archivos de nivel 1 y subdirectorios de cada directorio es casi constante, entonces este proceso debería escalar linealmente con el número total de archivos.
Esto es lo que se me ocurrió para implementar esto:
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 .
Ejecuté esto y obtuve un montón de find: findrecent: No such file or directory
errores. Motivo: -exec de find se ejecuta en un shell diferente. Traté de definir findrecent en .bashrc, .xsessionrc pero esto no ayudó [agradecería la ayuda aquí]. Al final recurrí a poner
#!/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;
en un script llamado findrecent
en mi RUTA y luego ejecutarlo.
Ejecuté esto, seguí esperando y esperando sin salida. Solo para asegurarme de que no estaba lidiando con ningún bucle infinito, modifiqué el archivo a
#!/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;
e intenté de nuevo. Funcionó, pero tardó 1 minuto y 35 segundos en mi carpeta personal, ¡las soluciones de Arreglo y enzotib tomaron 1.69, 1.95 segundos respectivamente!
¡Tanto por la superioridad de O (n) sobre O (n log (n))! ¡Maldita sea tu función, llamada sobrecarga! [O más bien, sobrecarga de llamadas de script]
Pero este script escala mejor que las soluciones anteriores y apuesto a que se ejecutará más rápido que ellos en el banco de memoria de Google; D