«ls -lt» suivra-t-il les mtimes précis ou juste les mtimes approximatifs jusqu'à la seconde?

10

ls -laffiche uniquement les horodatages de modification des fichiers jusqu'à la seconde. Si deux fichiers ont le même horodatage jusqu'à la seconde, mais ont été modifiés pas exactement en même temps, ls -ltles fichiers seront classés dans l'ordre des mtimes précis ou juste les mtimes approximatifs jusqu'à la seconde (et donc l'ordre entre les fichiers peut être arbitraire)?

Tim
la source

Réponses:

17

Cela dépend beaucoup de la lsmise en œuvre. De ces 4 trouvés sur un système GNU / Linux ici:

$ 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 , celui du projet GNU (de la collection GNU coreutils ). C'est celui que l'on trouve généralement sur les systèmes GNU comme Debian (noyaux Linux ou kFreeBSD), Cygwin ou Fedora.

    $ gnu-ls -rt
    a  c  b
    
  • Le lsdu Heirloom Toolchest , un port d'outils OpenSolaris:

    $ heirloom-ls -rt
    a  b  c
    
  • Le lsde la collection Open Source AT&T , éventuellement intégré ksh93. Un autre avec pas mal d'extensions fantaisistes:

    $ 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 (comme trouvé (ou un dérivé) sur la plupart des systèmes Linux (généralement intégrés)):

    $ busybox ls -rt
    c  b  a
    

Donc, parmi ceux-ci, GNU et ast lsconsidèrent la deuxième partie fractionnaire. Les autres retombent dans la comparaison lexicale des derniers fichiers modifiés dans la même seconde. Seule la boîte occupée fait lshonneur à la -r.

Dans mes tests, FreeBSD lsprend également en charge la précision en moins d'une seconde (à condition qu'ils soient activés au niveau VFS, voir vfs.timestamp_precisionsysctl).

zshLes globs (avec le omqualificatif glob à commander au moment de la modification, Ompour l'ordre inverse) prennent également le temps plein:

$ echo *(Om)
a c b

[ file1 -nt file2 ], lorsqu'ils sont pris en charge, prennent généralement en charge la granularité inférieure à la seconde .

Stéphane Chazelas
la source
1
Les outils non GNU violent-ils POSIX, ou spécifient-ils l'arrondi pour le tri?
Kevin
2
Quel est ast-ls?
Random832
@ Random832, voir modifier.
Stéphane Chazelas
2
@Kevin, d'après ma lecture de la spécification, ils ne sont pas conformes à cet égard. AFAICT, rien dans la spécification ne permet d'ignorer la partie en seconde et POSIX fournit une API claire pour récupérer des horodatages précis.
Stéphane Chazelas
1
@ikkachu, vous avez raison. Je ne l'avais pas remarqué. voir modifier. Cela change le résultat pour ast.
Stéphane Chazelas
4

En ce qui concerne l' lsimplémentation de GNU , l'exécution ls -lordonnera les fichiers par ordre alphabétique et ls -ltordonnera les fichiers par ordre de modification, le plus récent en premier, avec la plus grande précision prise en charge par le système de fichiers sous-jacent. Vous pouvez le vérifier en utilisant l' --full-timeoption.

Donc, pour répondre à votre question, oui, dans la plus large mesure possible, mais uniquement lorsque vous utilisez -t(sinon, il sera par défaut alphabétique), et utilisez une implémentation qui la prend en charge (voir la réponse de Stéphane pour plus de détails). Par exemple, ext4peut prendre en charge la précision en nanosecondes, étant donné des inodes suffisamment grands pour stocker les données d'horodatage requises.

Joe
la source
2
Vous devriez ajouter à votre réponse qu'il ne parle que de GNU ls. Il existe de nombreuses autres implémentations qui peuvent se comporter différemment.
Roland Illig
@RolandIllig ajouté
Joe
1

vous pouvez vérifier que si vous comparez la sortie de

ls -lat

et

ls -lat --full-time

le tri n'a rien d'arbitraire.

D'Arcy Nader
la source
1

Oui, il sera.

Pour tester, créez deux fichiers avec un petit décalage horaire:

$ touch aa; sleep 0.2; touch bb

Vérifiez les temps de modification:

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

La liste utilisera une telle différence:

$ 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

Avec --full-timela différence sera claire.

$ 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
Isaac
la source
Dans le dernier bloc, je crois que vous l'avez fait bbet à l' aaenvers.
Alex