¿seguirá `ls -lt` las mtimes exactas o solo las mtimes aproximadas hasta el segundo?

10

ls -lsolo muestra las marcas de tiempo de modificación de los archivos hasta el segundo. Si dos archivos tienen la misma marca de tiempo hasta el segundo, pero se modificaron no exactamente al mismo tiempo, ls -ltordenará los archivos en el orden de los tiempos exactos o solo los tiempos aproximados hasta el segundo (y, por lo tanto, el orden entre los archivos puede ser arbitrario)?

Tim
fuente

Respuestas:

17

Eso depende mucho de la lsimplementación. De los 4 encontrados en un sistema GNU / Linux aquí:

$ 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 , el del proyecto GNU (de la colección GNU coreutils ). Ese es el que generalmente se encuentra en los sistemas GNU como Debian (kernels Linux o kFreeBSD), Cygwin o Fedora.

    $ gnu-ls -rt
    a  c  b
    
  • El lsde Heirloom Toolchest , un puerto de herramientas OpenSolaris:

    $ heirloom-ls -rt
    a  b  c
    
  • El lsde la colección AT&T Open Source , posiblemente integrado ksh93. Otro con bastantes extensiones elegantes:

    $ 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 (como se encuentra (o un derivado) en la mayoría de los sistemas basados ​​en Linux (generalmente integrados):

    $ busybox ls -rt
    c  b  a
    

Entonces, de esos, GNU y ast lsconsideran la segunda parte fraccionaria. Los otros recurren a la comparación léxica para los archivos modificados por última vez en el mismo segundo. Solo busybox lsrinde homenaje al -rallí.

En mis pruebas, FreeBSD lstambién admite precisión de menos de un segundo (siempre que estén habilitadas en el nivel VFS, consulte vfs.timestamp_precisionsysctl).

zshLos globs (con el omcalificador glob para ordenar en el tiempo de modificación, Ompara el orden inverso) también toman el tiempo completo:

$ echo *(Om)
a c b

[ file1 -nt file2 ], Donde apoyado también en general apoyar granularidad sub-segundo .

Stéphane Chazelas
fuente
1
¿Las herramientas que no son GNU están violando POSIX, o especifica el redondeo para el tipo?
Kevin
2
¿Qué es ast-ls?
Random832
@ Random832, ver edición.
Stéphane Chazelas
2
@Kevin, de mi lectura de la especificación, no cumplen con ese aspecto. AFAICT, no hay nada en la especificación que permita ignorar la parte del segundo segundo y POSIX proporciona una API clara para recuperar marcas de tiempo precisas.
Stéphane Chazelas
1
@ikkachu, tienes razón. No me había dado cuenta de eso. ver editar Eso cambia el resultado para ast.
Stéphane Chazelas
4

Con respecto a la lsimplementación de GNU , la ejecución ls -lordenará los archivos en orden alfabético y ls -ltordenará los archivos en orden de tiempo de modificación, los más nuevos primero, con la mayor precisión admitida por el sistema de archivos subyacente. Puede verificar esto usando la --full-timeopción.

Por lo tanto, para responder a su pregunta, sí, en la mayor medida posible, pero solo cuando la usa -t(de lo contrario, será alfabética de forma predeterminada) y está utilizando una implementación que la admite (consulte la respuesta de Stéphane para obtener más detalles). Por ejemplo, ext4puede admitir precisión de nanosegundos, dados inodos lo suficientemente grandes como para almacenar los datos de marca de tiempo requeridos.

Joe
fuente
2
Debe agregar a su respuesta que solo habla sobre GNU ls. Hay muchas otras implementaciones que podrían comportarse de manera diferente.
Roland Illig
@RolandIllig agregó
Joe
1

puede verificar eso si compara la salida de

ls -lat

y

ls -lat --full-time

No hay nada arbitrario en la clasificación.

D'Arcy Nader
fuente
1

Sí lo hará

Para probar, cree dos archivos con una pequeña diferencia horaria:

$ touch aa; sleep 0.2; touch bb

Consultar horarios de modificación:

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

La lista usará tal diferencia:

$ 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

Con --full-timela diferencia quedará claro.

$ 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
fuente
En el último bloque, creo que tienes bby al aarevés.
Alex