Czy można uzyskać czas ostatniego otwarcia pliku i posortować wszystkie pliki w katalogu według tych czasów?
Zależy to dokładnie od tego, co rozumiesz przez „otwarty”, ale ogólnie tak. Zazwyczaj rejestrowane są trzy znaczniki czasu:
mtime
- aktualizowane po zmianie zawartości pliku. W większości przypadków jest to „domyślny” czas pliku.ctime
- aktualizowane po zmianie pliku lub jego metadanych (właściciela, uprawnień)atime
- aktualizowane po odczytaniu plikuOgólnie rzecz biorąc, chcesz zobaczyć atime
plik. Możesz to uzyskać za pomocą stat
lub za pomocą ls
. Możesz ls -lu
to zrobić, chociaż wolę używać ls -l --time=atime
(który powinien być obsługiwany w prawie wszystkich współczesnych dystrybucjach Linuksa), ponieważ nie używam go często, a kiedy to robię, lepiej go pamiętam. Aby posortować według czasu, dodaj -t
flagę do ls. Więc proszę bardzo.
Jest jednak duże zastrzeżenie. Aktualizacja za każdym razem, gdy plik jest odczytywany, powoduje wiele zwykle niepotrzebnych operacji we / wy, spowalniając wszystko. Tak więc większość dystrybucji Linuksa ma teraz domyślnie noatime
opcję montowania systemu plików, która w zasadzie zabija atimes, albo relatime
aktualizuje atime tylko po przekroczeniu limitu (zwykle raz dziennie) lub jeśli plik został faktycznie zmodyfikowany od poprzedniego odczytu. Możesz sprawdzić, czy te opcje są aktywne, uruchamiając mount
polecenie.
Pamiętaj również, że czasy dostępu są podane według i-węzłów, a nie według nazw plików, więc jeśli masz twarde linki, czytanie jednego z nich zaktualizuje wszystkie nazwy odnoszące się do tego samego pliku.
I pamiętaj, że c nie jest „stworzeniem”; tworzenie nie jest śledzone przez systemy plików Unix / Linux, co wydaje się dziwne, ale w rzeczywistości ma sens, ponieważ system plików nie ma możliwości sprawdzenia, czy jest oryginalny - może plik został utworzony czterdzieści lat temu i skopiowany tutaj. W rzeczywistości wiele edytorów plików działa, tworząc kopie na oryginale. Jeśli potrzebujesz tych informacji, najlepiej użyć takiego systemu kontroli wersji git
.
mount
strony podręcznika.ls
domyślnie skraca czas do rozsądnej precyzji. Aby dokładnie zobaczyć czas, można użyć--full-time
.ls -ltu
wyświetlić listę wszystkich plików, pokazując i sortując według czasu dostępu.Od
man ls
:źródło
find
Komenda jest najlepszy do tego. Zobacz-ctime
,-mtime
oraz-atime
opcjeźródło
Jeśli twoja lista jest przeznaczona do spożycia przez ludzi, użyj
ls
z jedną z flag sortowania według daty (-tu
dla czasu dostępu (odczytu), tylko-t
dla modyfikacji (zapisu) lub-tc
czasu zmiany i-węzła). Aby uzyskać więcej informacji, zobacz odpowiedź mattdm (w szczególności zastrzeżenie-a
i definicję-c
).Jeśli dotyczy to zużycia programu, analiza wyniku
ls
jest problematyczna . Jeśli twoją powłoką jest zsh, i tak nie potrzebujeszls
: zsh ma kwalifikatory globowania do sortowania dopasowań poprzez zwiększenie czasu dostępu (*(Oa)
), zmiany i-węzła (*(Oc)
) lub modyfikacji (*(Om)
). Małe literyo
sortują według wieku.W przeciwnym razie, jeśli wiesz, że nazwy plików nie zawierają znaków nowej linii ani znaków niedrukowalnych (w bieżącym języku), możesz zrobić coś takiego:
Jeśli chcesz wywołać polecenie na wielu plikach jednocześnie, potrzebujesz dodatkowej konfiguracji. Zauważ, że
act_on_files_by_date $(ls -t)
to nie działa tak samo, ponieważ nazwy plików zawierające znaki wieloznaczne lub białe znaki zostaną rozszerzone w wyniku podstawienia polecenia. Poniższy kod działa, o ile nazwa pliku nie zawiera nowego wiersza ani znaku, który nie może zostać wydrukowany:Jeśli chcesz poradzić sobie z dowolnymi nazwami plików, będziesz miał bardzo trudny czas bez uciekania się do potężniejszych narzędzi niż standardowa powłoka: zsh, perl, python…
źródło