Como saber se um arquivo tem mais de 30 minutos no AIX?

5

Gostaria de escrever um script de shell em ksh ou bash que saia com 1 se um arquivo específico tiver mais de 30 minutos. (Última modificação é mais de meia hora). Seria fácil em um Linux ou em um unix moderno, mas tenho que fazê-lo na versão 5.2 do AIX.

Então, as restrições:

  • não há opções -mmin -mmax em 'find'
  • não há nenhuma opção -d em contato ( toque em -d '30 minutos atrás 'temp e então localize! -newer temp não funciona)
  • não há comando 'stat'
  • não há parâmetro% s no comando 'data' ( data +% s não funciona)
  • Eu não tenho permissão para instalar nenhum software

Você poderia, por favor, ajudar como posso fazer isso com essas restrições?

    
por csadam 26.03.2012 / 19:30

4 respostas

5

Eu posso fazer isso usando apenas touch , test e date . (testado no AIX 5.3.0.0)

Primeiro você precisa criar um arquivo 30 minutos no passado (Infelizmente, isso requer conhecimento prévio do fuso horário atual na máquina. Mas você pode ser capaz de trabalhar nisso se necessário).

Neste exemplo, o fuso horário atual é EST5EDT (GMT-4). Se tiver sorte, o fuso horário da máquina será definido em GMT e você poderá usar apenas TZ=00:30 :

-bash-3.00# date
Mon 26 Mar 14:22:31 2012
-bash-3.00# touch -t 'TZ=04:30 date '+%Y%m%d%H%M.%S'' foo
-bash-3.00# ls -al foo
-rw-r--r--   1 root     system            0 26 Mar 13:52 foo

Agora use o teste para comparar as datas:

-bash-3.00# test '/smit.log' -ot foo && echo 'smit.log is older than 30min'
smit.log is older than 30min
    
por 26.03.2012 / 20:25
3

Use ls .

ls -l lista a hora da última modificação do arquivo.
Você pode dissecar a saída com awk ou cut e depois analisar a data.

Observe que no AIX (como na maioria dos sistemas * nix) o formato da data fornecida por ls depende de há quanto tempo o arquivo foi modificado pela última vez. Consulte a documentação para detalhes.

    
por 26.03.2012 / 19:47
1

Se você tem o básico, bash / tsh e sed. Você pode escrever um script simples que testará o tempo de filmagem associado à saída ls:

#/bin/bash

LSOUTPUT='ls -l'
IFS='
'

for f in $LSOUTPUT; do
  echo $f

  _sedout='echo $f|sed 's/.*....-..-.. ..:\(..\).*//''

  if [ "$_sedout" -gt 30 ]; then
    echo "Passed!"
  fi

  echo
done

Você terá que variar o seu regex sed para puxar o local certo, mas isso deve funcionar contanto que você tenha sed. Se o ls não fornecer detalhes suficientes, acredito que existe um comando chamado istat que você pode usar.

Se ksh for o seu shell, a sintaxe deve ser muito parecida com a do bash. Eu usei esse exemplo porque estou no Ubuntu.

    
por 26.03.2012 / 20:13
-1

Você ainda pode instalar o GNU find em findutils - link

    
por 24.05.2012 / 23:21

Tags