EDYCJA: Myślę, że ten post nie jest „szczególnie przydatny”, tak jak myślałem. To naprawdę szybkie rozwiązanie, które śledzi ostatnio zmodyfikowany plik (zamiast sortować całą listę plików):
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 ' '
Rozłożony na wiele linii dla przejrzystości wygląda następująco:
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 ' '
Koniec edycji
Niezbyt przydatny post, ale ponieważ „aranżacja” dotyczyła szybkości, pomyślałem, że się tym podzielę.
Rozwiązania arrange i enzotib obejmują wylistowanie wszystkich plików w katalogu wraz z ich mtimes, a następnie sortowanie. Jak wiadomo sortowanie nie jest konieczne, aby znaleźć maksimum. Znalezienie maksimum można wykonać w czasie liniowym, ale sortowanie zajmuje n log (n) czasu [Wiem, że różnica nie jest duża, ale nadal;)]. Nie mogę wymyślić dobrego sposobu na wdrożenie tego. [EDYCJA: Schludna (choć brudna) i szybka implementacja podana powyżej.]
Następna najlepsza rzecz - aby znaleźć ostatnio edytowany plik w katalogu, rekurencyjnie znajdź ostatnio edytowany plik w każdym podkatalogu poziomu 1. Niech ten plik reprezentuje podkatalog. Teraz posortuj pliki poziomu 1 wraz z przedstawicielami podkatalogów poziomu 1. Jeśli liczba plików poziomu 1 i podkatalogów każdego katalogu jest prawie stała, proces ten powinien być skalowany liniowo z całkowitą liczbą plików.
Oto, co wymyśliłem, aby to wdrożyć:
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 .
Uruchomiłem to i dostałem mnóstwo find: findrecent: No such file or directory
błędów. Powód: -exec find działa w innej powłoce. Próbowałem zdefiniować findrecent w .bashrc, .xsessionrc, ale to nie pomogło [doceniłbym tutaj pomoc]. W końcu zdecydowałem się na wprowadzenie
#!/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;
w skrypcie wywoływanym findrecent
w mojej ŚCIEŻCE, a następnie uruchamianym.
Uruchomiłem to, czekałem i czekałem bez wyjścia. Dla pewności nie miałem do czynienia z żadnymi nieskończonymi pętlami, do których zmodyfikowałem plik
#!/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;
i spróbowałem jeszcze raz. To działało - ale zajęło mi 1 minutę 35 sekund na moim folderze domowym - rozwiązania arrange i enzotib zajęły odpowiednio 1,69, 1,95 sekundy!
Tyle o wyższości O (n) nad O (n log (n))! Cholera, zadzwoń narzut! [A raczej narzut wywołania skryptu]
Ale ten skrypt skaluje się lepiej niż wcześniejsze rozwiązania i założę się, że będzie działał szybciej niż one w banku pamięci google; D