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.
-
zshstat: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.