Você pode usar algo como:
/bin/date +%Y%m%d%H%M%S -d "$(/usr/bin/stat -c %x find.txt)"
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.
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
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
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