EDIT: Bu yazının düşündüğüm gibi 'özellikle kullanışlı değil' olduğunu düşünüyorum. Bu, en son değiştirilen dosyayı izleyen (tüm dosya listesini sıralamak yerine) gerçekten hızlı bir çözümdür:
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 ' '
Netlik için birden fazla satıra yayılmış olarak aşağıdaki gibi görünür:
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 ' '
EDIT’in sonu
Özellikle yararlı bir gönderi değil, ancak 'düzenlemek' hız tartışırken, bunu paylaşacağımı düşündüm.
arrange ve enzotib'in çözümleri dizindeki tüm dosyaları mtimları ile listelemeyi ve ardından sıralamayı içerir. Bildiğiniz gibi maksimum bulmak için sıralama gerekli değildir. Lineer zamanda maksimum bulma yapılabilir, ancak sıralama n log (n) zaman alır [aradaki fark çok fazla değil ama yine de;)]. Bunu yapmanın düzgün bir yolunu düşünemiyorum. [EDIT: Temiz (kirli görünümlü de olsa) ve yukarıda verilen hızlı uygulama.]
Sonraki en iyi şey - Bir dizindeki en son düzenlenen dosyayı bulmak için, her seviye 1 alt dizininde en son düzenlenen dosyayı tekrar tekrar bulun. Bu dosyanın alt dizini temsil etmesine izin verin. Şimdi seviye 1 dosyalarını, seviye 1 alt dizinlerinin temsilcileriyle birlikte sıralayın. Her dizinin seviye 1 dosyalarının ve alt dizinlerinin sayısı neredeyse sabitse, bu işlem toplam dosya sayısıyla doğrusal olarak ölçeklenmelidir.
Bunu uygulamak için geldiğim şey buydu:
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 .
Bunu koştum ve bir sürü find: findrecent: No such file or directory
hata yaptım . Sebep: -exec farklı bir kabukta çalışır. Ben. Sonunda koymak için başvurdum
#!/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;
PATH'imde adı findrecent
geçen ve sonra çalıştıran bir komut dosyasında .
Bunu koştum, hiç beklemeden beklemeye devam ettim. Sadece sonsuz döngülerle ilgilenmediğimden emin olmak için dosyayı değiştirdim.
#!/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;
ve tekrar denedim. İşe yaradı - ancak ev klasörüme 1 dakika 35 saniye sürdü - aranjör ve enzotib'in çözümleri sırasıyla 1.69, 1.95 saniye sürdü!
O (n) 'in O (n log (n)) üzerindeki üstünlüğü için çok fazla! Kahretsin, seni çağır! [Veya komut dosyası çağrısı ek yükü]
Ancak bu komut dosyası önceki çözümlerden daha iyi ölçeklenir ve bahse girerim google’ın bellek bankasında olduğundan daha hızlı çalışacaktır;