Data completa do arquivo (sem utilitários GNU)

2

Estou tentando obter a data completa (criada ou modificada) de um determinado arquivo para passar para outro programa. Tentei variações de opções com o comando ls, mas nenhuma delas fornece uma data completa para arquivos com menos de 6 meses e tenho limite de uso das opções. Quando tento certas opções que vi tentando pesquisar isso, recebo a seguinte mensagem:

usage: ls [-1ACFHLNRabcdefgilmnopqrstuxEUX] [File...]

Nenhum dos quais parece fornecer o que eu preciso, tanto quanto eu posso dizer, então eu tentei usar o comando stat, mas não está disponível para mim.

Estou usando o shell Korn no AIX 5.3, que tem comandos limitados disponíveis. Alguém pode sugerir outra maneira de obter a data de criação ou modificação de um arquivo como uma data completa (dd / mm / aaaa ou aaaa / mm / dd).

    
por Matt_Roberts 15.01.2016 / 13:51

2 respostas

11

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
    Co 1992-05-13 14:57:00 +0100
  • GNU stat : stat -c %y file
    Co 1992-05-13 14:57:00.123368710 +0100
  • BSD stat : stat -t '%F %T %z' -f %Sm file
    Co 1992-05-13 14:57:00 +0100
  • IRIX stat : stat -m file
  • GNU find : find file -prune -printf '%TF %TT %Tz\n'
    Co 1992-05-13 14:57:00.1233687100 +0100
  • GNU date : date -r file '+%F %T.%N %z'
    Co 1992-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'
    Co 1992-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.

    
por 15.01.2016 / 14:18
1

Se você tem o GNU ls :

ls --time-style=long-iso -l

ou

ls --time-style=+FMT -l

onde o FMT segue o formato de comando date . No seu caso:

ls --time-style=+%Y/%m/%d -l
    
por 15.01.2016 / 13:58