Wird `ls -lt` den genauen Zeiten oder nur den ungefähren Zeiten bis zur Sekunde folgen?

10

ls -lzeigt nur die Änderungszeitstempel der Dateien bis zu einer Sekunde an. Wenn zwei Dateien den gleichen Zeitstempel bis zu einer Sekunde haben, aber nicht genau zur gleichen Zeit geändert wurden, werden ls -ltdie Dateien in der Reihenfolge der genauen Zeitangaben oder nur der ungefähren Zeitangaben bis zur Sekunde angeordnet (und daher kann die Reihenfolge zwischen den Dateien sein willkürlich)?

Tim
quelle

Antworten:

17

Das hängt sehr stark von der lsImplementierung ab. Von diesen 4 auf einem GNU / Linux-System hier gefundenen:

$ touch a; touch c; touch b; stat -c %y a c b
2018-01-10 12:52:21.367640342 +0000
2018-01-10 12:52:21.371640148 +0000
2018-01-10 12:52:21.375639952 +0000
  • GNUls , die aus dem GNU-Projekt (aus der GNU coreutils- Sammlung). Dies ist diejenige, die normalerweise auf GNU-Systemen wie Debian (Linux- oder kFreeBSD-Kernel), Cygwin oder Fedora zu finden ist.

    $ gnu-ls -rt
    a  c  b
    
  • Die lsaus der Heirloom Toolchest , einer Portierung von OpenSolaris-Tools:

    $ heirloom-ls -rt
    a  b  c
    
  • Die lsaus der AT & T Open Source-Sammlung , möglicherweise eingebaut ksh93. Eine andere mit einigen ausgefallenen Erweiterungen:

    $ ast-ls -rt
    a  c  b
    $ PATH=/opt/ast/bin:$PATH ksh93 -c 'type ls; ls -rt'
    ls is a shell builtin version of /opt/ast/bin/ls
    a  c  b
    
  • Busybox (wie auf den meisten (allgemein eingebetteten) Linux-basierten Systemen gefunden (oder als Derivat)):

    $ busybox ls -rt
    c  b  a
    

Von diesen betrachten GNU und ast lsden Bruchteil des zweiten Teils. Die anderen greifen auf den lexikalischen Vergleich von Dateien zurück, die zuletzt innerhalb derselben Sekunde geändert wurden. Nur Busybox lsehrt das -rdort.

In meinen Tests unterstützen FreeBSDs lsauch eine Genauigkeit von vfs.timestamp_precisionweniger als einer Sekunde (vorausgesetzt, sie sind auf VFS-Ebene aktiviert, siehe sysctl).

zshDie Globs (mit dem omGlob-Qualifikationsmerkmal, das zur Änderungszeit bestellt werden muss, Omin umgekehrter Reihenfolge) benötigen ebenfalls die volle Zeit:

$ echo *(Om)
a c b

[ file1 -nt file2 ], wo unterstützt, unterstützen im Allgemeinen auch Granularität in Sekundenbruchteilen .

Stéphane Chazelas
quelle
1
Verstoßen die Nicht-GNU-Tools gegen POSIX oder gibt es eine Rundung für die Sortierung an?
Kevin
2
Was ist ast-ls?
Random832
@ Random832, siehe Bearbeiten.
Stéphane Chazelas
2
@ Kevin, nach meiner Lektüre der Spezifikation sind sie in dieser Hinsicht nicht konform. AFAICT, es gibt nichts in der Spezifikation, was es erlaubt, den Teil der zweiten Sekunde zu ignorieren, und POSIX bietet eine klare API zum Abrufen präziser Zeitstempel.
Stéphane Chazelas
1
@ikkachu, du hast recht. Das hatte ich nicht bemerkt. siehe bearbeiten. Das ändert das Ergebnis für ast.
Stéphane Chazelas
4

In Bezug auf die lsImplementierung von GNU werden beim Ausführen ls -ldie Dateien in alphabetischer Reihenfolge und ls -ltdie Dateien in der Reihenfolge der Änderungszeit (neueste zuerst) mit der größten Genauigkeit sortiert, die vom zugrunde liegenden Dateisystem unterstützt wird. Sie können dies mit der --full-timeOption überprüfen .

Um Ihre Frage zu beantworten, ja, so weit wie möglich, aber nur, wenn Sie sie verwenden -t(andernfalls wird sie standardmäßig alphabetisch verwendet) und eine Implementierung verwenden, die sie unterstützt (siehe Stéphanes Antwort für weitere Einzelheiten). Zum Beispiel ext4kann Nanosekunde Präzision, da groß genug Inodes unterstützen die erforderlichen Zeitstempel - Daten zu speichern.

Joe
quelle
2
Sie sollten Ihrer Antwort hinzufügen, dass es sich nur um GNUs handelt. Es gibt viele andere Implementierungen, die sich möglicherweise anders verhalten.
Roland Illig
@ RolandIllig hinzugefügt
Joe
1

Sie können dies überprüfen, wenn Sie die Ausgabe von vergleichen

ls -lat

und

ls -lat --full-time

Das Sortieren ist dort nicht willkürlich.

D'Arcy Nader
quelle
1

Ja, es wird.

Erstellen Sie zum Testen zwei Dateien mit einem kleinen Zeitunterschied:

$ touch aa; sleep 0.2; touch bb

Änderungszeiten überprüfen:

$ stat -c %y bb aa
2018-01-07 20:51:19.364248042 0000
2018-01-07 20:51:19.072248226 0000

In der Liste wird ein solcher Unterschied verwendet:

$ ls -lt aa bb
-rw-r--r-- 1 user user 0 Jan  7 20:51 bb
-rw-r--r-- 1 user user 0 Jan  7 20:51 aa

Mit --full-timedem Unterschied wird klar.

$ ls -lt --full-time aa bb
-rw-r--r-- 1 user user 0 2018-01-07 20:51:19.364248042 0000 bb
-rw-r--r-- 1 user user 0 2018-01-07 20:51:19.072248226 0000 aa
NotAnUnixNazi
quelle
Im letzten Block glaube ich, dass Sie haben bbund aarückwärts.
Alex