Wygląda na to, że ls
nie sortuje plików poprawnie podczas wykonywania połączenia rekurencyjnego:
ls -altR . | head -n 3
Jak znaleźć ostatnio zmodyfikowany plik w katalogu (w tym w podkatalogach)?
bash
filesystems
find
JMW
źródło
źródło
Odpowiedzi:
W przypadku wielkiego drzewa może być trudno
sort
zachować wszystko w pamięci.%T@
daje ci czas modyfikacji jak uniksowy znacznik czasu,sort -n
sortuje numerycznie,tail -1
pobiera ostatni wiersz (najwyższy znacznik czasu),cut -f2 -d" "
odcina pierwsze pole (znacznik czasu) od wyniku.Edycja: Tak jak
-printf
prawdopodobnie tylko GNU, tak samo użytecznestat -c
jest użycie . Chociaż można zrobić to samo na BSD, opcje formatowania są inne (-f "%m %N"
wydaje się)I brakowało mi części liczby mnogiej; jeśli chcesz więcej niż ten ostatni plik, po prostu podbić argument ogon.
źródło
sort -rn | head -3
zamiastsort -n | tail -3
. Jedna wersja podaje pliki od najstarszego do najnowszego, a druga od najnowszej do najstarszej.sort
utworzy pliki tymczasowe (w/tmp
) zgodnie z potrzebami, więc nie sądzę, że to niepokoi.-printf '%T@ %Tb %Td %TY %p\n'
da ci datownik (w razie potrzeby) (podobny dols
)find . -type f -printf '%TF %TT %p\n' | sort | tail -1
W odpowiedzi na odpowiedź @ plundra , oto wersja BSD i OS X:
źródło
find
obsługuje+
zamiast tego\;
? Ponieważ robi to to samo (przekazując wiele plików jako parametry), bez-print0 | xargs -0
potoku.head -1
sięhead -5
Zamiast sortować wyniki i przechowywać tylko te ostatnio zmodyfikowane, możesz użyć awk, aby wydrukować tylko ten z największym czasem modyfikacji (w czasie uniksowym):
Powinno to być szybszym sposobem rozwiązania problemu, jeśli liczba plików jest wystarczająco duża.
Użyłem znaku NUL (tj. „\ 0”), ponieważ teoretycznie nazwa pliku może zawierać dowolny znak (w tym spację i znak nowej linii), ale to.
Jeśli nie masz takich patologicznych nazw plików w systemie, możesz również użyć znaku nowej linii:
Ponadto działa to również w mawk.
źródło
mawk
standardową alternatywą Debiana.Miałem problem ze znalezieniem ostatnio zmodyfikowanego pliku w systemie Solaris 10. Nie
find
ma takiejprintf
opcji istat
nie jest dostępny. Odkryłem następujące rozwiązanie, które działa dobrze dla mnie:Aby wyświetlić również nazwę pliku, użyj
Wyjaśnienie
find . -type f
znajduje i wyświetla wszystkie plikised 's/.*/"&"/'
zawija nazwę ścieżki w cudzysłów, aby obsługiwać białe znakixargs ls -E
wysyła cytowaną ścieżkę dols
,-E
opcja zapewnia zwrot pełnego znacznika czasu (format rok-miesiąc-dzień godzina-minuta-sekundy-nanosekundy )awk '{ print $6," ",$7 }'
wyodrębnia tylko datę i godzinęawk '{ print $6," ",$7," ",$9 }'
wyodrębnia datę, godzinę i nazwę plikusort
zwraca pliki posortowane według datytail -1
zwraca tylko ostatni zmodyfikowany plikźródło
To wydaje się działać dobrze, nawet w podkatalogach:
W przypadku zbyt wielu plików sprecyzuj wyszukiwanie.
źródło
-l
Opcjals
wydaje się zbędne. Po prostu-tr
wydaje się wystarczająca.find . -type f -print0 | xargs -0 ls -ltr | tail -n 1
Pokazuje najnowszy plik ze znacznikiem czasu czytelnym dla człowieka:
Wynik wygląda następująco:
Aby wyświetlić więcej plików, zamień
-n1
na wyższy numerźródło
Cały czas używam czegoś podobnego, a także listy najlepszych ostatnio modyfikowanych plików. W przypadku dużych drzew katalogów może być znacznie szybsze, aby uniknąć sortowania . W przypadku pierwszego najlepiej zmodyfikowanego pliku:
W katalogu zawierającym 1,7 miliona plików otrzymuję najnowszy z 3,4 s, przyspieszenie 7,5x w stosunku do rozwiązania 25,5s za pomocą sortowania.
źródło
lastfile
), a następnie możesz robić, co chcesz z wynikiem, na przykładls -l $(lastfile .)
, lubopen $(lastfile .)
(na komputerze Mac) itp.To daje posortowaną listę:
Odwróć kolejność, umieszczając „-r” w poleceniu sortowania. Jeśli chcesz tylko nazwy plików, wstaw „awk” {print 11 USD} „|” przed „| głowa'
źródło
W Ubuntu 13 robi to, może odrobinę szybciej, ponieważ odwraca sortowanie i używa „głowy” zamiast „ogona”, co zmniejsza pracę. Aby wyświetlić 11 najnowszych plików w drzewie:
odnaleźć . -type f -printf '% T @% p \ n' | sort -n -r | głowa -11 | cut -f2- -d "" | sed -e 's, ^. / ,,' | xargs ls -U -l
Daje to pełną listę ls bez ponownego sortowania i pomija denerwujące „./”, które „find” umieszcza na każdej nazwie pliku.
Lub jako funkcja bash:
Mimo to większość pracy została wykonana przy użyciu oryginalnego rozwiązania Plundry. Dzięki plundra.
źródło
Napotkałem ten sam problem. Muszę znaleźć najnowszy plik rekurencyjnie. znalezienie zajęło około 50 minut.
Oto mały skrypt, aby zrobić to szybciej:
Jest to funkcja rekurencyjna, która pobiera najnowszą zmodyfikowaną pozycję katalogu. Jeśli ten element jest katalogiem, funkcja jest wywoływana rekurencyjnie i szuka w tym katalogu itp.
źródło
Uważam, że następujące wyniki są krótsze i bardziej zrozumiałe:
Biorąc pod uwagę stałą długość znormalizowanych formatów danych ISO, sortowanie leksykograficzne jest w porządku i nie potrzebujemy
-n
opcji sortowania.Jeśli chcesz ponownie usunąć znaczniki czasu, możesz użyć:
źródło
Jeśli uruchamianie
stat
każdego pliku osobno jest spowolnione, możesz użyć goxargs
do przyspieszenia:źródło
To rekurencyjnie zmienia czas modyfikacji wszystkich katalogów w bieżącym katalogu na najnowszy plik w każdym katalogu:
źródło
Ta prosta cli będzie również działać:
Możesz zmienić -1 na liczbę plików, które chcesz wyświetlić
źródło
Uznałem powyższe polecenie za przydatne, ale w moim przypadku musiałem zobaczyć datę i godzinę pliku, a także miałem problem z kilkoma plikami, które mają spacje w nazwach. Oto moje działające rozwiązanie.
źródło
Następujące polecenie działało w systemie Solaris:
źródło
Ignorowanie ukrytych plików - z ładnym i szybkim znacznikiem czasu
Wynik
Dobrze radzi sobie ze spacjami w nazwach plików - nie należy ich używać!
Więcej
Więcej
find
obfitości po linku.źródło
Aby wyszukać pliki w katalogu / target_directory i wszystkich jego podkatalogach, które zostały zmodyfikowane w ciągu ostatnich 60 minut:
Aby znaleźć ostatnio zmodyfikowane pliki, posortowane w odwrotnej kolejności czasu aktualizacji (tj. Najpierw najnowsze zaktualizowane pliki):
źródło
Wolę ten, jest krótszy:
źródło
Napisałem pypi / github na to pytanie, ponieważ potrzebowałem również rozwiązania.
https://github.com/bucknerns/logtail
Zainstalować:
Zastosowanie: ogony zmieniły pliki
Użycie 2: Otwiera ostatnio zmieniony plik w edytorze
źródło