EDIT: Saya kira posting ini tidak 'tidak terlalu berguna' seperti yang saya kira. Ini adalah solusi yang sangat cepat yang hanya melacak file yang paling baru dimodifikasi (daripada menyortir seluruh daftar 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 ' '
Sebarkan beberapa baris untuk kejelasan seperti berikut:
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 ' '
Akhir dari EDIT
Bukan pos yang sangat berguna tetapi karena 'mengatur' membahas kecepatan, saya pikir saya akan membagikan ini.
solusi mengatur dan enzotib melibatkan daftar semua file di dalam direktori dengan waktu mereka dan kemudian menyortir. Seperti yang Anda ketahui penyortiran tidak perlu untuk menemukan yang maksimal. Menemukan maksimum dapat dilakukan dalam waktu linier tetapi pengurutan membutuhkan waktu n log (n) [Saya tahu perbedaannya tidak banyak, tetapi tetap;)]. Saya tidak bisa memikirkan cara yang rapi untuk mengimplementasikan ini. [EDIT: A rapi (meskipun terlihat kotor) dan implementasi cepat disediakan di atas.]
Hal terbaik berikutnya - Untuk menemukan file yang paling baru diedit dalam direktori, secara rekursif cari file yang paling baru diedit di setiap subdirektori level 1. Biarkan file ini mewakili subdirektori. Sekarang urutkan file level 1 bersama dengan perwakilan dari subdirektori level 1. Jika jumlah jumlah file level 1 dan sub-dir dari masing-masing direktori hampir konstan, maka proses ini harus skala secara linear dengan jumlah total file.
Inilah yang saya buat untuk mengimplementasikan ini:
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 .
Saya menjalankan ini dan mendapat banyak find: findrecent: No such file or directory
kesalahan. Alasan: -exec dari find running di shell yang berbeda. Saya mencoba mendefinisikan findrecent di .bashrc, .xsessionrc tetapi ini tidak membantu [Saya akan menghargai bantuan di sini]. Pada akhirnya saya memilih untuk meletakkan
#!/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;
dalam skrip bernama findrecent
PATH saya dan kemudian jalankan.
Saya menjalankan ini, terus menunggu dan menunggu tanpa hasil. Hanya untuk memastikan saya tidak berurusan dengan loop tak terbatas, saya memodifikasi 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;
dan mencoba lagi. Itu berhasil - tetapi butuh 1 menit 35 detik pada homefolder saya - solusi mengatur dan enzotib mengambil masing-masing 1,69, 1,95 detik!
Begitu banyak keunggulan O (n) dibanding O (n log (n))! Sialan kau fungsi panggilan overhead! [Atau lebih tepatnya panggilan skrip panggilan]
Tapi skrip ini memiliki skala yang lebih baik daripada solusi sebelumnya dan saya yakin itu akan berjalan lebih cepat daripada mereka di bank memori google; D