o `ls -lt` segue os tempos precisos ou apenas os tempos aproximados até o segundo?

10

ls -lmostra apenas os carimbos de data e hora da modificação dos arquivos até o segundo. Se dois arquivos tiverem o mesmo registro de data e hora até o segundo, mas não foram modificados exatamente ao mesmo tempo, ls -ltos arquivos serão ordenados na ordem dos horários precisos ou apenas nos horários aproximados até o segundo (e, portanto, a ordem entre os arquivos pode ser arbitrário)?

Tim
fonte

Respostas:

17

Isso depende muito da lsimplementação. Desses 4 encontrados em um sistema GNU / Linux aqui:

$ 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 , o do projeto GNU (da coleção coreutils do GNU ). Esse é o normalmente encontrado em sistemas GNU como Debian (Linux ou kFreeBSD), Cygwin ou Fedora.

    $ gnu-ls -rt
    a  c  b
    
  • A lspartir do Heirloom Toolchest , uma porta de ferramentas OpenSolaris:

    $ heirloom-ls -rt
    a  b  c
    
  • O lsda coleção de código-fonte aberto da AT&T , possivelmente incorporado ksh93. Outro com algumas extensões sofisticadas:

    $ 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 encontrado (ou derivado) na maioria dos sistemas baseados em Linux (geralmente embutidos)):

    $ busybox ls -rt
    c  b  a
    

Então, desses, GNU e ast lsconsideram a segunda parte fracionária. Os outros retornam à comparação lexical dos arquivos modificados pela última vez no mesmo segundo. Apenas o busybox lshonra o -rlocal.

Nos meus testes, o FreeBSD lstambém suporta precisão de segundos (desde que eles estejam habilitados no nível do VFS, consulte vfs.timestamp_precisionsysctl).

zshOs globos (com o omqualificador glob para solicitar no horário da modificação, Ompara ordem inversa) também levam o tempo todo:

$ echo *(Om)
a c b

[ file1 -nt file2 ], onde o suporte também geralmente oferece suporte a granularidade de segundos .

Stéphane Chazelas
fonte
1
As ferramentas que não são GNU estão violando o POSIX ou especificam arredondamentos para a classificação?
Kevin
2
O que é ast-ls?
precisa saber é o seguinte
@ Random832, veja editar.
Stéphane Chazelas
2
@ Kevin, da minha leitura das especificações, elas não são compatíveis nesse sentido. AFAICT, não há nada na especificação que permita que a parte de subsegundo seja ignorada e o POSIX fornece uma API clara para recuperar registros de data e hora precisos.
Stéphane Chazelas
1
@ikkachu, você está certo. Eu não tinha notado isso. veja editar. Isso muda o resultado para ast.
Stéphane Chazelas
4

Com relação à lsimplementação do GNU , a execução ls -lordenará os arquivos em ordem alfabética e ls -ltordenará os arquivos na ordem do tempo de modificação, o mais recente primeiro, com a maior precisão suportada pelo sistema de arquivos subjacente. Você pode verificar isso usando a --full-timeopção

Portanto, para responder à sua pergunta, sim, da melhor maneira possível, mas somente quando você usar -t(caso contrário, o padrão será alfabético) e estiver usando uma implementação que a suporte (consulte a resposta de Stéphane para obter mais detalhes). Por exemplo, ext4pode suportar precisão de nanossegundos, considerando inodes grandes o suficiente para armazenar os dados de carimbo de data / hora necessários.

Joe
fonte
2
Você deve adicionar à sua resposta que ele fala apenas sobre o GNU ls. Existem muitas outras implementações que podem se comportar de maneira diferente.
Roland Illig
@RolandIllig adicionou
Joe
1

você pode verificar se, se comparar a saída de

ls -lat

e

ls -lat --full-time

não há nada arbitrário na classificação.

D'Arcy Nader
fonte
1

Sim vai.

Para testar, crie dois arquivos com uma pequena diferença de horário:

$ touch aa; sleep 0.2; touch bb

Verifique os tempos de modificação:

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

A lista usará essa diferença:

$ 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

Com --full-timea diferença ficará 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
fonte
No último bloco, acredito que você tem bbe aapara trás.
Alex