EDIT: suppongo che questo post non sia "non particolarmente utile" come pensavo. Questa è una soluzione davvero veloce che tiene traccia del file modificato più di recente (invece di ordinare l'intero elenco di file):
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 ' '
Distribuito su più righe per maggiore chiarezza, appare come segue:
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 ' '
Fine di EDIT
Non è un post particolarmente utile ma dato che "organizzare" stava discutendo della velocità, ho pensato di condividerlo.
Le soluzioni di arrangiamento ed enzotib comportano elencare tutti i file all'interno della directory con i loro mtime e quindi ordinarli. Come sai l'ordinamento non è necessario per trovare il massimo. Trovare il massimo può essere fatto in tempo lineare, ma l'ordinamento richiede n log (n) tempo [So che la differenza non è molto, ma comunque;)]. Non riesco a pensare a un modo pulito per implementarlo. [EDIT: un'implementazione pulita (anche se sporca) e veloce fornita sopra.]
Prossima cosa migliore - Per trovare il file modificato più di recente in una directory, trova ricorsivamente il file modificato più di recente in ogni sottodirectory di livello 1. Lascia che questo file rappresenti la sottodirectory. Ora ordina i file di livello 1 insieme ai rappresentanti delle sottodirectory di livello 1. Se il numero di file e sottodirectory di livello 1 di ciascuna directory è quasi una costante, questo processo dovrebbe ridimensionarsi linearmente con il numero totale di file.
Questo è quello che mi è venuto in mente per implementare questo:
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 .
Ho eseguito questo e ho avuto un sacco di find: findrecent: No such file or directory
errori. Motivo: -exec di find viene eseguito in una shell diversa. Ho provato a definire findrecent in .bashrc, .xsessionrc ma questi non mi hanno aiutato [apprezzerei l'aiuto qui]. Alla fine ho fatto ricorso al mettere
#!/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 uno script chiamato findrecent
nel mio PERCORSO e quindi in esecuzione.
Ho eseguito questo, ho continuato ad aspettare e ad aspettare senza uscita. Solo per essere sicuro di non avere a che fare con loop infiniti in cui ho modificato il file
#!/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 riprovato. Ha funzionato - ma ci sono voluti 1 minuto e 35 secondi sulla mia cartella di casa - le soluzioni di organ ed enzotib hanno richiesto rispettivamente 1,69, 1,95 secondi!
Questo per quanto riguarda la superiorità di O (n) su O (n log (n))! Dannazione, la tua funzione è chiamata in testa! [O piuttosto overhead della chiamata di script]
Ma questo script si adatta meglio delle soluzioni precedenti e scommetto che funzionerà più velocemente di loro sul banco di memoria di Google; D