Com ls
, embora você nem sempre consiga obter o tempo , você deve conseguir derivar a data (ano, mês e dia da mês).
Na localidade C, a saída de data em ls -l
deve ser Mmm dd HH:MM
para arquivos recentes (e você deve conseguir derivar o ano (este ano ou o anterior) ou Mmm dd YYYY
para arquivos mais antigos ou arquivos com uma hora de modificação no futuro Então você deve sempre conseguir tirar a data (AAAA-mm-dd):
eval "$(date +'year=%Y month=%m')"
LC_ALL=C ls -dn file | awk -v y="$year" -v m="$month" '{
month = index("--JanFebMarAprMayJunJulAugSepOctNovDec", $6) / 3
day = $7
if ($8 ~ /:/)
year = y - (month > m)
else
year = $8
printf "%04d-%02d-%02d\n", year, month, day
exit}'
Agora, se você quiser o tempo de modificação completo com a máxima precisão, não há um comando padrão para isso.
Você encontrará algumas implementações ls
que têm opções para isso ( ls --full-time
com GNU ls
ou -D <format>
com FreeBSD ls
, por exemplo)
Existem diversas implementações diferentes e incompatíveis de um comando stat
(IRIX, zsh
builtin, GNU, BSD) que podem lhe dar isso.
Ou você pode usar o predicado -printf
do GNU find
. Ou a opção -r
do GNU date
.
Nem todas as implementações fornecem granularidade abaixo de segundos. E cuidado com os fusos horários e horário de verão dependendo do formato escolhido e do fuso horário em que você está, uma determinada saída pode ser ambígua e se referir a mais de uma data possível.
Para links simbólicos, você também pode se perguntar se é a hora de modificação do link ou o destino que você está procurando. Algumas das opções mencionadas aqui farão uma ou outra por padrão, e algumas delas podem receber ordens para fazer uma ou outra sob demanda.
-
zsh
stat:stat -F '%Y-%m-%d %T %z' +mtime file
Co1992-05-13 14:57:00 +0100
- GNU
stat
:stat -c %y file
Co1992-05-13 14:57:00.123368710 +0100
- BSD
stat
:stat -t '%F %T %z' -f %Sm file
Co1992-05-13 14:57:00 +0100
- IRIX
stat
:stat -m file
- GNU
find
:find file -prune -printf '%TF %TT %Tz\n'
Co1992-05-13 14:57:00.1233687100 +0100
- GNU
date
:date -r file '+%F %T.%N %z'
Co1992-05-13 14:57:00.123368710 +0100
- FreeBSD
ls
:ls -D '[%F %T %z]' -l file
Co-r-xr-xr-x 2 bin bin 372298 [1992-05-13 14:57:00 +0100] file
- GNU
ls
:ls --full-time -l file
Co-r-xr-xr-x 2 bin bin 372298 1992-05-13 14:57:00.123368710 +0100 file
- ast-open
ls
:ls -Z '%(mtime:time=%F %T.%N %z)s'
Co1992-05-13 14:57:00.123368710 +0100
AIX, que sua sinopse ls
sugere que você esteja usando tem um istat
( Página man do AIX 5.3 ) que exibe datas por extenso (sem granularidade de subsegundos e ambíguo, a menos que você force TZ
to UTC0
), embora não tão fácil de analisar:
$ LC_ALL=C TZ=UTC0 istat file
Inode 10360 on device 10/6 File
Protection: r-xr-xr-x
Owner: 2(bin) Group: 2(bin)
Link count: 2 Length 372298 bytes
Last updated: Wed May 13 14:08:13 1992
Last modified: Wed May 13 13:57:00 1992
Last accessed: Sun Jan 31 15:49:23 1993
Observe também que, para links simbólicos, você obterá a data do destino do link simbólico, não o próprio link simbólico.
Se você não tiver acesso a nenhum deles, sua melhor opção para portabilidade pode ser perl
:
$ perl -MPOSIX -le 'print strftime("%Y-%m-%d %T %z", localtime((lstat(shift))[9]))' file
1992-05-13 14:57:00 +0100
Note que poucos sistemas têm um tempo de criação para arquivos (às vezes chamado tempo de nascimento ), e não há API padrão, e muito menos comando para consultá-lo, então a situação é ainda pior do que o tempo de modificação.