System operacyjny: Linux
Typ systemu plików: ext3
Preferowane rozwiązanie: bash (skrypt / oneliner), ruby, python
Mam kilka katalogów z kilkoma podkatalogami i plikami. Muszę sporządzić listę wszystkich tych katalogów, która jest zbudowana w taki sposób, że każdy katalog pierwszego poziomu jest wyświetlany obok daty i godziny najnowszego utworzonego / zmodyfikowanego pliku w nim.
Aby wyjaśnić, jeśli dotknę pliku lub zmodyfikuję jego zawartość o kilka poziomów podkatalogów w dół, znacznik czasu powinien być wyświetlany obok nazwy katalogu pierwszego poziomu. Powiedzmy, że mam katalog o takiej strukturze:
./alfa/beta/gamma/example.txt
i modyfikuję zawartość pliku example.txt
, potrzebuję czasu wyświetlanego obok katalogu pierwszego poziomu alfa
w czytelnej dla człowieka formie, a nie epoce. Próbowałem kilka rzeczy za pomocą znalezienia xargs
, sort
i lubi, ale nie mogę obejść ten problem, że timestamp plików z „alfa” nie zmienia się podczas tworzenia / modyfikowania plików kilka poziomów w dół.
źródło
Odpowiedzi:
Spróbuj tego:
Uruchom go ze ścieżką do katalogu, w którym powinien rozpocząć skanowanie rekurencyjnie (obsługuje nazwy plików ze spacjami).
Jeśli jest dużo plików, może to chwilę potrwać, zanim cokolwiek zwróci. Wydajność można poprawić, jeśli
xargs
zamiast tego zastosujemy :co jest nieco szybsze.
źródło
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
to wciąż jest dla mnie szybkie.brew install coreutils
i użyjgstat
zamiaststat
stat
ponieważfind PATH -type f -printf "%T@ %p\n"| sort -nr
wykonuje zadanie. W ten sposób jest też nieco szybszy.find PATH -type f -exec stat -f "%m %N" "{}" \; | sort -nr | head
Aby znaleźć wszystkie pliki, których status został ostatnio zmieniony N minut temu:
find -cmin -N
na przykład:
find -cmin -5
źródło
sudo find -cmin -1 2>&1 |grep -v /proc/
GNU Find (patrz
man find
) ma-printf
parametr do rozproszenia plików EPOC mtime i względnej nazwy ścieżki.źródło
tail
aby zapobiec wydrukowaniu tysięcy linii na wydruku.awk '{print $2}'
część wydaje się powodować problemy, gdy istnieją nazwy plików ze spacjami. Oto rozwiązanie wykorzystującesed
zamiast tego, a także wyświetla czas oprócz ścieżki:find . -type f -printf '%T@ %Tc %P\n' | sort -n | tail | sed -r 's/^.{22}//'
touch "lala<Enter>b"
aby utworzyć taki plik. Myślę, że projektowanie narzędzi unix ma dużą wadę w nazwie pliku.Skróciłem niesamowitą odpowiedź halo na ten jednowarstwowy
Zaktualizowano : Jeśli w nazwach plików znajdują się spacje, możesz użyć tej modyfikacji
źródło
IFS=$'\n'
w żadnym wypadku nie jest bezpieczne podczas obsługi nazw plików: znaki nowej linii to prawidłowe znaki w nazwach plików w systemie UNIX. Tylko znak NUL gwarantuje, że nie będzie obecny na ścieżce.Spróbuj tego
Służy
find
do gromadzenia wszystkich plików z katalogu,ls
wyświetlania ich posortowanych według daty modyfikacji,head
wybierania pierwszego pliku i wreszciestat
wyświetlania czasu w ładnym formacie.W tej chwili nie jest bezpieczne dla plików z białymi znakami lub innymi znakami specjalnymi w ich nazwach. Napisz pochwałę, jeśli jeszcze nie spełnia twoich potrzeb.
źródło
To polecenie działa w systemie Mac OS X:
find "$1" -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
W systemie Linux, zgodnie z pytaniem oryginalnego plakatu, użyj
stat
zamiastgstat
.Ta odpowiedź jest oczywiście znakomitym rozwiązaniem użytkownika user37078 , awansowanym od komentarza do pełnej odpowiedzi. I mieszać w CharlesB wglądu „s do użytku
gstat
w systemie Mac OS X. Dostałem Coreutils z DarwinPorts zamiast homebrew , nawiasem mówiąc.A oto jak spakowałem to w proste polecenie
~/bin/ls-recent.sh
do ponownego użycia:źródło
~/bin/ls-recent.sh
, czy dokładnie sprawdziłeś skrypt pod kątem różnic?find . -exec stat -f '%m%t%Sm %N' {} + | sort -n | cut -f2-
Zarówno rozwiązania Perla, jak i Pythona w tym poście pomogły mi rozwiązać ten problem w systemie Mac OS X: /unix/9247/how-to-list-files-sorted-by-modification-date-recursively -no-stat-polecenie-dostępne .
Cytowanie z postu:
Perl:
Pyton:
źródło
Ignorowanie ukrytych plików - z ładnym i szybkim znacznikiem czasu
Dobrze radzi sobie ze spacjami w nazwach plików - nie żebyś ich używał!
Więcej
find
obfitości można znaleźć, klikając link.źródło
Pokazuję to dla ostatniego czasu dostępu, możesz łatwo to zmodyfikować, aby zrobić najnowszy czas modyfikacji.
Można to zrobić na dwa sposoby:
1) Jeśli chcesz uniknąć globalnego sortowania, które może być kosztowne, jeśli masz dziesiątki milionów plików, możesz: (ustawić się w katalogu głównym katalogu, w którym chcesz rozpocząć wyszukiwanie)
Powyższa metoda drukuje nazwy plików z coraz nowszym czasem dostępu, a ostatnim drukowanym plikiem jest plik z najnowszym czasem dostępu. Możesz oczywiście uzyskać najnowszy czas dostępu, używając „ogona -1”.
2) Możesz znaleźć rekursywnie wydrukować nazwę, czas dostępu do wszystkich plików w podkatalogu, a następnie posortować według czasu dostępu i ogona największego wpisu:
I masz to ...
źródło
Mam ten alias w moim .profile, którego używam dość często
Robi to, czego szukasz (z wyjątkiem tego, że nie przemierza wielu poziomów daty / godziny) - szuka najnowszych plików (w tym przypadku plików * .log i * .trc); także wyszukuje tylko pliki zmodyfikowane w ciągu ostatniego dnia, a następnie sortuje według czasu i potoków generuje mniej:
ps. Zauważ, że nie mam root na niektórych serwerach, ale zawsze mam sudo, więc możesz nie potrzebować tej części.
źródło
Możesz wydać komendę printf, aby znaleźć próbę
źródło
Funkcja szybkiego uderzenia:
Znajdź najnowszy zmodyfikowany plik w katalogu:
Możesz również określić swój własny format daty / godziny jako trzeci argument.
źródło
Poniższe zwraca ciąg znacznika czasu i nazwę pliku z najnowszym znacznikiem czasu:
Wynikające z wyniku formularza:
<yy-mm-dd-hh-mm-ss.nanosec> <filename>
źródło
Oto jedna wersja, która działa z nazwami plików, które mogą również zawierać spacje, znaki nowej linii, znaki globalne:
find ... -printf
wypisuje modyfikację pliku (wartość EPOCH), po której następuje spacja i\0
zakończone nazwy plików.sort -zk1nr
odczytuje zakończone NUL dane i sortuje je odwrotnie numeryczniePonieważ pytanie jest oznaczone
gnu
linuksem, zakładam, że narzędzia są dostępne.Możesz wykonać potok powyżej:
aby wydrukować czas modyfikacji i nazwy plików posortowane według czasu modyfikacji (najnowsze od pierwszego) zakończonego znakiem nowej linii.
źródło
Właśnie tego używam (bardzo wydajny):
Plusy:
STOSOWANIE:
gdzie:
dir
- katalog do przeszukania [aktualny katalog]number
- liczba najnowszych plików do wyświetlenia [10]Dane wyjściowe dla
find_last /etc 4
wygląda następująco:źródło
Aby uzyskać zwykły
ls
wydruk, użyj tego. Nie ma listy argumentów, więc nie może być za długa:I upiększony
cut
tylko datami, godzinami i nazwami:EDYCJA : Właśnie zauważyłem, że aktualna najwyższa odpowiedź sortuje według daty modyfikacji. Jest to równie łatwe z drugim przykładem tutaj, ponieważ data modyfikacji jest pierwsza w każdym wierszu - klaps sortuj na końcu:
źródło
Można to również zrobić za pomocą funkcji rekurencyjnej w bash
Niech F wyświetla funkcję pliku, która musi być leksykograficznie sortowalna rrrr-mm-dd itd. (Zależna od systemu operacyjnego?)
R funkcja rekurencyjna działająca w katalogach
I w końcu
źródło