Obtém a hora de modificação do arquivo em um formato específico (yyyymmddhhmiss)

3

Eu quero obter o tempo de modificação de um arquivo em um formato específico.
Como posso fazer isso?
Eu sei sobre

stat -c %x find.txt

mas preciso deste formato:

yyyymmddhh24miss

Estou usando ksh on Linux 2.6.18-406.el5 x86_64 se isso for importante.

    
por ANOUK_prog 27.05.2016 / 14:40

3 respostas

1

Você pode usar algo como:

/bin/date +%Y%m%d%H%M%S -d "$(/usr/bin/stat -c %x find.txt)"
    
por 27.05.2016 / 15:10
3

Com ferramentas GNU:

find file -prune -printf '%TY%Tm%Td%TH%TM%TS\n'

Ou

date -r file +%Y%m%d%H%M%S.%N

(embora tenha cuidado com links simbólicos, que exibem a hora de modificação do alvo do link simbólico, não o link em si (que pode ser tão bom quanto quem se importa com o mtime de um link simbólico) veja -L com find para fazer o mesmo)).

Se o seu ksh for ksh93 e ele tiver sido construído com o date incorporado ativado:

command /opt/ast/bin/date -m -f %Y%m%d%H%M%S.%N file

( command /opt/ast/bin/date invoca o date builtin ligado a /opt/ast/bin/date , se você adicionar /opt/ast/bin na frente de $PATH , esses recursos internos serão invocados automaticamente quando você os chamar pelo nome).

Se você não se importa com a parte fracionária, remova o .%N ou o find , substitua o %TS pelo %.2TS .

Observe que o horário será dado no fuso horário atual. Como esse formato de data não inclui o deslocamento UTC, ele pode ser ambíguo. Por exemplo, no meu fuso horário britânico:

$ date -r file1
Sun 30 Oct 01:00:00 BST 2016
$ date -r file2
Sun 30 Oct 01:00:00 GMT 2016

Esses dois arquivos têm uma hora de modificação com 3600 segundos de diferença, um antes, um após a mudança para o horário de inverno, mas ainda no mesmo clock de parede (já que o relógio foi recuado uma hora no intervalo). / p>

$ find file? -prune -printf '%TY%Tm%Td%TH%TM%TS\n'
20161030010000.0000000000
20161030010000.0000000000

Para ter tempos não ambíguos, você pode incluir o deslocamento UTC:

$ find file? -prune -printf '%TY%Tm%Td%TH%TM%TS%Tz\n'
20161030010000.0000000000+0100
20161030010000.0000000000+0000

Ou informe a hora em UTC:

$ TZ=UTC0 find file? -prune -printf '%TY%Tm%Td%TH%TM%TS\n'
20161030000000.0000000000
20161030010000.0000000000
    
por 27.05.2016 / 15:22
1

A hora do arquivo modificação , pode ser formatada com data:

$ date -d @"$(stat -c %Y file1)" +'%Y%m%d%H%M%S'

Use %X para o último acesso e %Z para a última alteração.

No entanto, a resolução máxima de %X , %Y e %Z é segundos.
Para resolução de nanossegundos, use as opções %x , %y e %z :

$ date -d "$(stat -c %y file1)" +'%Y%m%d%H%M%S.%N'
20151101020000.012345678

Como já estamos usando a data, podemos simplificar usando a opção -r da data ou podemos usar a saída formatada do find:

$ date -r file1 +'%Y%m%d%H%M%S%z'
20151101010000-0500
$ find file1 -printf '%TY%Tm%Td%TH%TM%2.2TS%Tz\n'
20151101010000-0500

A resolução dos comandos acima é de segundos. Se nanosegundos forem necessários:

$ date -r file1 +'%Y%m%d%H%M%S.%N%z'
20151101010000.012345678-0500
$ find file1 -printf '%TY%Tm%Td%TH%TM%TS%Tz\n'
20151101010000.0123456780-0500

Esses dois comandos dão tempo de modificação | Na data, não há como obter acesso ou tempo de status com a opção -r .
Em find: Altere% T para% A para o tempo de acesso e para% C para o tempo de alteração de status

Sobre o fuso horário

Por favor, note que todos os comandos acima são afetados pelo fuso horário usado:

$ date -r file1 +'%Y%m%d%H%M%S.%N%z'
20151101010000.012345678
$ TZ=GMT0 date -r file1 +'%Y%m%d%H%M%S.%N%z'
20151101060000.012345678

Observe a alteração da hora de 01 para 06 . Isso acontece porque o computador usado tinha um fuso horário definido para America/New_York . Quando o tempo é calculado no GMT0 offset (também conhecido como GMT ou GMT+0 ou GMT-0 ), seu valor aumenta em 5 horas.

Além disso, o uso de valores de hora local (se incompletos) pode apresentar valores iguais quando eles são realmente diferentes:

$ date -r file1 +'%Y%m%d%H%M%S.%N'; date -r file2 +'%Y%m%d%H%M%S.%N'
20151101010000.012345678
20151101010000.012345678

É por isso que o %z é necessário para os tempos locais :

$ date -r file1 +'%Y%m%d%H%M%S.%N%z'; date -r file2 +'%Y%m%d%H%M%S.%N%z'
20151101010000.012345678-0500
20151101010000.012345678-0400

Isso torna os valores diferentes. Mas esse tipo de formato dificulta a classificação pelo tempo. É por isso que a melhor solução é usar GMT times porque o deslocamento de tempo ( %z ) é sempre 0 e pode ser omitido:

$ ( TZ=GMT0; date -r file1 +'%Y%m%d%H%M%S.%N'; date -r file2 +'%Y%m%d%H%M%S.%N')
20151101060000.012345678
20151101050000.012345678

E a classificação é possível.

[1] Valores usados para tocar em arquivos usados.
touch -m -d '20151101 01: 00: 00.012345678-05' file1
toque -a -d '20151101 01: 00: 00.987654321-05' file1
touch -m -d '20151101 01: 00: 00.012345678-04' file2
touch -a -d '20151101 01: 00: 00.987654321-04' file2

    
por 28.05.2016 / 10:45

Tags