Ist es möglich, die Uhrzeit zu ermitteln, zu der die Datei zuletzt geöffnet wurde, und alle Dateien in einem Verzeichnis nach dieser Uhrzeit zu sortieren?
Dies hängt genau davon ab, was Sie mit "geöffnet" meinen, aber im Allgemeinen ja. Normalerweise werden drei Zeitstempel aufgezeichnet:
mtime
- aktualisiert, wenn sich der Inhalt der Datei ändert. Dies ist in den meisten Fällen die "Standard" -Dateizeit.ctime
- aktualisiert, wenn sich die Datei oder ihre Metadaten (Eigentümer, Berechtigungen) ändernatime
- aktualisiert, wenn die Datei gelesen wirdIm Allgemeinen ist das, was Sie sehen möchten, das atime
einer Datei. Das kann man mit stat
oder mit bekommen ls
. Sie können ls -lu
dies tun, obwohl ich es vorziehen würde ls -l --time=atime
(was in fast allen modernen Linux-Distributionen unterstützt werden sollte), weil ich es nicht oft benutze und wenn ich es tue, kann ich mich besser daran erinnern. Und um nach Zeit zu sortieren , fügen Sie das -t
Flag zu ls hinzu. Hier bitteschön.
Es gibt jedoch eine große Einschränkung. Das Aktualisieren der Zeit jedes Mal, wenn eine Datei gelesen wird, verursacht eine Menge normalerweise unnötiger E / A und verlangsamt alles. Daher verwenden die meisten Linux-Distributionen standardmäßig die noatime
Mount-Option für das Dateisystem, die im Grunde genommen manchmal nicht funktioniert, oder relatime
die nur dann aktualisiert wird, wenn ein Limit überschritten wurde (normalerweise einmal pro Tag) oder wenn die Datei seit dem letzten Lesevorgang tatsächlich geändert wurde. Sie können feststellen, ob diese Optionen aktiv sind, indem Sie den mount
Befehl ausführen.
Beachten Sie auch, dass die Zugriffszeiten nach Inode und nicht nach Dateiname angegeben werden. Wenn Sie also über Hardlinks verfügen, werden beim Lesen von 1 alle Namen aktualisiert, die auf dieselbe Datei verweisen.
Und sei dir bewusst, dass c nicht "Schöpfung" ist; Die Erstellung wird nicht von Unix / Linux-Dateisystemen verfolgt, was seltsam erscheint, aber tatsächlich sinnvoll ist, da das Dateisystem nicht weiß, ob es sich um das Original handelt - möglicherweise wurde die Datei vor vierzig Jahren erstellt und hierher kopiert. Tatsächlich arbeiten viele Datei-Editoren damit, Kopien über das Original zu erstellen. Wenn Sie diese Informationen benötigen, verwenden Sie am besten ein Versionskontrollsystem wie git
.
mount
Manpage.ls
verkürzt die Zeit standardmäßig auf eine vernünftige Genauigkeit. Um die Zeit in voller Präzision zu sehen, kann man verwenden--full-time
.ls -ltu
liste alle dateien auf, zeige und sortiere nach zugriffszeit.Von
man ls
:quelle
Der
find
Befehl ist dafür am besten geeignet. Siehe die-ctime
,-mtime
und-atime
Optionenquelle
Wenn Ihr Eintrag für den menschlichen Verzehr bestimmt ist, verwenden Sie ihn
ls
mit einem der Datumssortierungsflags (-tu
für die Zugriffszeit (Lesezeit), nur-t
für die Änderungszeit (Schreibzeit) oder-tc
für die Inode-Änderungszeit). Siehe mattdm Antwort für weitere Informationen (insbesondere in Bezug auf die Einschränkung-a
und die Definition-c
).Wenn dies für den Programmverbrauch vorgesehen ist, ist das Parsen der Ausgabe von
ls
problematisch . Wenn Ihre Shell zsh ist, brauchen Sie das auch nichtls
: zsh hat Globbing-Qualifikatoren, um die Übereinstimmungen zu sortieren, indem Sie die Zugriffszeit (*(Oa)
), die Inode-Änderung (*(Oc)
) oder die Änderungszeit (*(Om)
) erhöhen . Ein Kleinbuchstabeo
sortiert nach zunehmendem Alter.Wenn Sie sonst wissen, dass die Dateinamen keine Zeilenumbrüche oder nicht druckbaren Zeichen enthalten (im aktuellen Gebietsschema), können Sie so etwas tun
Wenn Sie einen Befehl für viele Dateien gleichzeitig aufrufen möchten, müssen Sie weitere Einstellungen vornehmen. Beachten Sie, dass
act_on_files_by_date $(ls -t)
dies nicht so funktioniert, da Dateinamen, die Platzhalterzeichen oder Leerzeichen enthalten, im Ergebnis der Befehlsersetzung erweitert werden. Der folgende Code funktioniert, solange kein Dateiname eine neue Zeile oder ein nicht druckbares Zeichen enthält:Wenn Sie mit willkürlichen Dateinamen fertig werden möchten, haben Sie es sehr schwer, ohne auf leistungsfähigere Werkzeuge als eine Standard-Shell zurückzugreifen: zsh, perl, python ...
quelle