Jak mogę uzyskać listę wszystkich plików w bieżącym katalogu wraz z datą ich modyfikacji i posortować według tej daty?
Teraz wiem, jak to osiągnąć z find
, stat
a sort
, ale z jakiegoś powodu dziwne stat
nie jest zainstalowany na tym polu i jest mało prawdopodobne, że mogę go zainstalować.
Jakaś inna opcja?
PS: też gcc
nie jest zainstalowany
find
-printf
Działanie wydaje się być najprostszym chociaż.Odpowiedzi:
Moja najkrótsza metoda używa zsh:
(dodaj
D
kwalifikatory glob, jeśli chcesz również wyświetlić listę ukrytych plików lub plików w ukrytych katalogach).Jeśli masz GNU find, pozwól mu wydrukować czasy modyfikacji pliku i posortuj według tego. Zakładam, że w nazwach plików nie ma nowych linii.
Jeśli masz Perla (ponownie, zakładając, że w nazwach plików nie ma nowych wierszy):
Jeśli masz Python (ponownie, zakładając, że nie ma nowych linii w nazwach plików):
Jeśli masz dostęp SSH do tego serwera, zamontuj katalog przez sshfs na lepiej wyposażonym komputerze:
Dzięki tylko narzędziom POSIX jest to o wiele bardziej skomplikowane, ponieważ nie ma dobrego sposobu na znalezienie czasu modyfikacji pliku. Jedynym standardowym sposobem pobierania czasów pliku jest
ls
, a format wyjściowy jest zależny od ustawień regionalnych i trudny do przeanalizowania.Jeśli możesz pisać do plików i dbasz tylko o zwykłe pliki, a w nazwach plików nie ma nowych wierszy, oto okropna kludge: twórz twarde linki do wszystkich plików w jednym katalogu i sortuj je według czasu modyfikacji.
źródło
find . -print | xargs -n99999 -s999999 ls -ltr
. Ale ma to problem polegający na tym, że (1)xargs
może nie pozwolić na-m
więcej niż 512 lub-s
więcej niż 5120, i (b) nawet jeśli można to obejść, wciąż istnieje narzucony przez jądro maksymalny rozmiar połączonej listy argumentów i środowiska. Większość twoich pomysłów (oprócz Perla i Pythona) ma ten sam problem, dlatego właśnie unikałem tworzenia długich linii poleceń.zsh
rekurencyjnych globów w ogólnym przypadku.print -rl **/*
Jedynym ograniczeniem jest ilość wolnej pamięci), a poza tym jestzargs
. Twoja propozycjafind … | xargs … ls
posortuje się poprawnie, jeślixargs
zakończy się wywołaniemls
tylko raz i nie będzie działać, jeśli w nazwach plików znajdują się znaki specjalne.Zakładając GNU
find
:Zmień
1n,1
na,1nr,1
jeśli chcesz, aby pliki były wymienione jako najnowsze jako pierwsze.Jeśli nie masz GNU
find
, staje się to trudniejsze, ponieważls
format znacznika czasu różni się bardzo (na przykład ostatnio zmodyfikowane pliki mają inny styl znacznika czasu).źródło
ls --time-style="..."
- nie jestem pewien, czy jest to standard, czy GNU, prawdopodobnie GNU.ls
nie ma tej opcji.Na Macu nie ma argumentu -printf do znalezienia, ale możesz to zrobić w zamian:
find . -print0 | xargs -0 -n 100 stat -f"%m %Sm %N" | sort -n|awk '{$1="";print}'
źródło
można tego spróbować (choć trzeba to sam zbudować) https://github.com/shadkam/recentmost
ź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
Mówiąc ogólnie o znalezieniu plików według daty (to nie zadziała w przypadku oryginalnego plakatu, ale skończyłem tutaj, więc pomyślałem, że inni też mogą). W moim przypadku użytkowania chcę wyświetlić listę plików w celu przejrzenia ich przed usunięciem.
W findutils 4.6.0 lubię:
Powyższe polecenie wyszukuje pliki (
-type f
) w bieżącym katalogu roboczym (.
), które zostały zmodyfikowane ponad 270 dni temu (-mtime +270
również-mtime 0
będzie produkować ostatnich 24 godzin, a-mtime -5
ukazuje ostatnie 5 dni). Następnie używa ichls
do wyświetlenia według daty, najpierw najnowszej (-exec ls -laFGht --time-style=iso {} \+
)Oto próbka danych wyjściowych:
Wspaniałą rzeczą jest to, że po przejrzeniu listy łatwo jest zastąpić część listy
find
poleceniem delete:źródło