data - alguns exemplos de uso e linha de comando e scripts

Atualizado em: 20/12/2007



Sobre este documento

linhas de comando e scripts com uso de data.

Dicas sobre date

Consutar o manual

date --help

man date

date - imprime ou acerta a data e hora do sistema

man zic

zic - compilador de fusos horários

Manipular arquivos de acordo com a data, localizar, remover e outros serviços relacionados com a data do arquivo, veja indicações no final deste documento e também consulte o man.

man tmpwatch

man find

man touch

Idioma, cuidado que o formato de exibição muda conforme o idioma.

Compare os resultados abaixo.

  echo `date +%A`
  sábado
  
  echo `LANG=pt_BR date '+%A'`
  sábado
  
  echo `LANG=UTF-8 date '+%A'`
  Saturday
  
  echo `LANG=en_US date '+%A'`
  Saturday
  
  echo `LANG=C date '+%A'`
  Saturday
  
  
  MDIA=$(LANG=pt_BR date '+%A')
  echo $MDIA
  sábado

nanosegundos, do man date

  date +%H:%M:%S:%N
  23:33:45:915809000

hora certa

O Observatório Nacional fornece equipamentos especiais para sincronismo com relógios atômicos de Césio, serviço especial para servidores sem acesso a internet, além do equipamento também tem certificação da hora. Mais informações e dados tecnicos acesse a página.

http://pcdsh01.on.br/ispy.asp

Servidor de hora local

Prefira configurar uma maquina da rede como servidor de hora local para as demais maquinas, em resumo, uma maquina acerta a hora com algum servidor na internet e esta mesma maquina funciona como servidor para os demais micros da rede interna, incluindo aqueles sem acesso à internet.

Exemplo para SUSE 10.1 e CL10 No micro que vai funcionar como servidor, instale e configure o ntp (servidor de tempo), depois libere acesso para as demais maquinas da rede interna acertar a hora com ele.

  acrescentar em /etc/ntp.conf
  # Libera acesso remoto somente para minha rede local 192.168.1.0
  restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

Nas demais maquinas da rede não precisa do servidor de ntp, somente do cliente ntpdate, automatize o acerto de hora em hora com algum script, como exemplo este script

  #!/bin/sh
  /usr/sbin/ntpdate -s 192.168.1.2

Onde 192.168.1.2 é o IP do micro rodando o servidor ntp interno.

Rodar toda hora, as linhas de comando abaixo cria o script dentro do /etc/cron.hourly

  echo \#\!\/bin/sh  > /etc/cron.hourly/horacerta
  echo "/usr/sbin/ntpdate -s 192.168.1.2" >> /etc/cron.hourly/horacerta
  chmod +x /etc/cron.hourly/horacerta
  # rccron restart

Reinicie o cron, o comando muda conforme a distro, no SUSE execute.

rccron restart

Em maquinas com firewall precisa liberar acesso na porta 123, cuidado para não liberar para o mundo, netstat -na deve mostrar a porta 123, algo semelhante a isto.

  udp        0      0 192.168.1.2:123       0.0.0.0:*
  udp        0      0 127.0.0.1:123           0.0.0.0:*
  udp        0      0 0.0.0.0:123             0.0.0.0:*

Alguns tutoriais sobre servidor ntp local, servir hora para demais maquinas da rede.
http://www.dotsharp.com.br/artigos/Linux/Como_Montar_um_Servidor_NTP.html

http://www.ntp.org/

Sincronização dos relógios via rede (hora certa)

Configure seus servidores para manter a hora certa, acertar com servidores externos, existem diversos na internet.

Também é possível manter servidor de tempo interno, NTP tem pacote para cliente e servidor.

ATENÇÃO!!!

Acertar a hora com servidores externos requer acesso à internet, caso não funcione, certifique que o micro tem acesso à internet e que não tenha bloqueios de firewall, proxy e etc..

Existem muitos servidores de tempo, quando um falhar tente outros, use script com instruções de testes, tente configurar de forma que na falha de um servidor de tempo, automaticamente aponte para outro servidor, tudo isto é gratuíto, tudo é questão da precisão desejada e elaborar script apropriado.

Configure para acertar a hora periodicamente, em servidores com acesso à internet a melhor solução via NTP, configure no crontab para executar automaticamente.

Com menor precisão pode usar script para sincronizar com outras maquinas da rede

Estações de trabalho pode executar o script no boot.

Conforme a distro o pacote muda de nome, procure no gerenciador de pacotes de sua distro pelo pacote que faz esta tarefa.

NTP sincronização de hora via rede e internet

Hora brasileira.
http://www.horacerta.com.br/
http://pcdsh01.on.br/ispy.htm

Instalar NTP a partir do fonte, este pacote está presente na maioria das distro, caso não encontre no gerenciador de pacotes de sua instlação, para instalar a partir dos fontes, siga este tutorial
http://www.ansp.br:8080/fbr/ntp/LINUX
RNP > Serviços > Serviço NTP
Serviço NTP
Os servidores NTP permitem aos seus clientes a sincronização dos relógios de seus computadores e outros equipamentos de rede a partir de uma referência padrão de tempo aceita mundialmente, conhecida como UTC (Universal Time Coordinated).
http://www.rnp.br/ntp/
TIME-UFRJ
Serviço de sincronização de hora via rede na UFRJ
http://time.pads.ufrj.br/

NTP
O Network Time Protocol (NTP) é um protocolo desenvolvido para funcionar sobre TCP/IP, permitindo a sincronização dos relógios dos sistemas de uma rede
http://www.nara.org.br/servicos/ntp/

NTP, download e tutorial em português
http://www.nara.org.br/servicos/ntp/ntp-para-linux
NTP: The Network Time Protocol
http://www.ntp.org/

horário de verão

Fique atento às datas e locais, o horário de verão na lei é diferente do real, iniciam e terminam em dias diferentes, também não se aplica a todo o Brasil.

Mensagens na lista Linux-br - horário de verão
http://www.zago.eti.br/horario-de-verao.txt

Mais mensagens sobre este assunto no FAQ.
http://www.zago.eti.br/data.txt

Kubuntu 7.04

Instale e inicie o ntp, demora alguns minutos para acertar a hora, caso tenha problemas com demora longa, pode copiar endereços de outros servidores de ntp, basta acrescentar no /etc/ntp.conf, como exemplo segue 3 endereços.

  # Random pool server, see http://www.pool.ntp.org/ for more information
  server 0.pool.ntp.org
  server 1.pool.ntp.org
  server 2.pool.ntp.org

Linha de comando para instalar e iniciar ntp.

  smart install ntp
  /etc/init.d/ntp restart

SUSE 10.1

Os pacotes e procedimentos são os mesmos nas duas arquiteturas, separei em duas partes, x86_64 configurado manualmente e i386 configurado via yast.

SUSE 10.1 x86_64

Yast configura ntp via interface gráfica. Procure por Serviços de Rede -> Cliente de NTP.

Comandos e resultados de testes em linha de comando.

Instalação com perfil KDE inclue o pacote do ntp, não inicia nem atualiza a hora, mesmo iniciando manualmente na linha de comando não acerta hora.

Teste e configuração via linha de comando, para testar alterei a hora e executei.

rcntp restart

Não acertou a hora, solução; incluir no final de /etc/ntp.conf esta linha.

server 2.pool.ntp.org

Depois da inclusão precisa executar: rcntp restart

Assim acertou a hora, se preferir pode incluir com esta linha de comando.

echo "server 2.pool.ntp.org" >> /etc/ntp.conf

rcntp restart

Syncronizar a hora junto durante o boot, acrescente o comando no final de /etc/rc.d/boot.local

echo "rcntp restart" >> /etc/rc.d/boot.local

SUSE 10.1 i386

Instalado com perfil KDE, não tentei configuração manual.

Yast tem opção via yast em modo texto ou gráfico, no cosole do root execute:

yast

Procure por Serviços de Rede -> Cliente de NTP.

Configure e habilite o serviço, basta selecionar para iniciar o serviço e selecionar o pool de servidores indicado. Faça o teste com opção (Testar), retornando a informação que o servidor está no alcance da rede, então está OK, basta prosseguir para atualizar a hora.

Automaticamente configura o serviço para iniciar com o boot

  chkconfig --list | grep ntp
  ntp                       0:off  1:off  2:on   3:on   4:off  5:on   6:off

Consulte o manual do SUSE

  4 4 Sincronização de horário com xntp                                         679
     44.1 Configurando um cliente NTP com YaST . . . . . . . . . . . . . . .    679
     44.2 Configurando o xntp na rede . . . . . . . . . . . . . . . . . . .     683
     44.3 Configurando um relógio de referência local . . . . . . . . . . . . . 683

Quando a diferença for grande pode não funcionar, precisa acertar a hora manualmente para depois acertar via rede, linha de comando para acertar a hora manualmente

date -s 22:35

depois execute o comando para acertar via rede.

Deve salvar as configurações do NTP em

/etc/ntp.conf

Não testei configuração manual nem precisou instalar pacotes quando configurado via yast. Na minha instalação não precisou instalar mas tem diversos pacotes relacionados a NTP, procure por ntp no gerenciador de pacotes.

Caso precise parar o serviço.

rcntp stop

Iniciar manualmente

rcntp start

Veja também sobre netdate e ntpdate, pesquise sobre ntp.

ntpdate - set the date and time via NTP

Teste, parei o serviço ntp, alterei a hora e iniciei o serviço novamente, automaticamente acertou a hora.

  ecs741:/tmp # rcntp start
  ecs741:/tmp # date
  Sat Jul  1 22:39:48 BRT 2006
  ecs741:/tmp # rcntp start
  Try to get initial date and time via NTP from 0.pool.ntp.org 1.pool.ntdoneg 2.pool.ntp.org
  Starting network time protocol daemon (NTPD)                          done
  ecs741:/tmp # date
  Sat Jul  1 03:26:16 BRT 2006

Veja o log

tail -f /var/log/ntp

SUSE 10.0 x86_64

Seguindo os mesmos passos do SUSE 10.1 não atualiza a hora, verificando no /etc/ntp.conf não encontrei servidores de hora, a configuração default não vem com servidores de hora. Solução, copiar os servidores de hora do /etc/ntp.conf de outro local, neste caso fiz a copia de outra instalação do SUSE 10.1

Caso tenha problema com acerto de hora, já sabe, precisa incluir um servidor de hora, acrescente no final de /etc/ntp.conf, esta linha:

server 2.pool.ntp.org

depois faça o teste, adiante alguns minutos e reinicie o serviço ntp para conferir se está funcionando e acertando a hora.

  date -s 02:05
  suse64:/etc # date
  Sex Jul 28 02:05:04 BRT 2006
  suse64:/etc # rcntp restart
  Shutting down network time protocol daemon (NTPD)                     done
  Try to get initial date and time via NTP from  2.pool.ntp.org         done
  Starting network time protocol daemon (NTPD)                          done
  suse64:/etc # date
  Sex Jul 28 01:51:01 BRT 2006

OK, acertou a hora, (voltou a hora)

CL 10

Acertar hora do micro com servidores de hora na internet.

Instalei o pacote ntp.

  apt-get install ntp
  service ntpd start 

Testar se está acertando a hora, adiantei alguns minutos e reiniciei o serviço ntpd .

  date -s 01:20
  Sex Jul 28 01:20:00 BRT 2006
  
  service ntpd restart
  Salvando hora atual do sistema para o relógio da máquina:    [  OK  ]
  Interrompendo NTP server (ntpd):                             [  OK  ]
  Sincronizando tempo para ntpd:                               [  OK  ]
  Iniciando NTP server (ntpd):                                 [  OK  ]
  
  date
  Sex Jul 28 01:12:25 BRT 2006

Parece OK, voltou a hora, mas está com diferença de 11 segundos (adiantado) em relação a hora deste site.

http://www.horacerta.com.br/

Não sei quem está com a hora errada, para obter melhor precisão, compare com outros servidores de hora, faça copia do conf do ntpd e teste com outros servidores de hora.

Não alterei a configuração do ntpd, o conf dele e servidores de hora ficam no arquivo

/etc/ntp.conf

Também tem o pacote rdate que não testei, tem dicas sobre ele no tópico sobre CL9

  apt-cache search ntpd
  rdate - Leitor de relógio remoto (e ajustador local)

CL9

Conectiva tem o pacote rdate

man rdate -> no CL9 o manual está em portugues.

Exemplo de linha de comando com rdate

rdate -s ntp.on.br

Veja também sobre o uso de NTPDATE

exemplo de uso do ntpdate para atualizar com o servidor cais.rnp.br, execute:

ntpdate ntp.cais.rnp.br

script para acertar hora

O mais indicado é o serviço NTP que tem mais precisão, veja próximo tópico, este script é uma "gambiarra" para quem não consegue configurar o NTP. Procure evitar esta opção e configuração manual, para quem não faz questão de precisão ele quebra o galho e acho mais eficiente que digitar a hora na linha de comando.

Acertar a hora com o servidor de tempo

Observatório Nacional Divisão Serviço da Hora

http://pcdsh01.on.br/ispy.asp

Ajuste o script abaixo conforme sua região, troque a expressão grep 'Bras' pela da sua região, no exemplo abaixo está ajustado para pegar a hora de Brasília, pode copiar e colar na linha de comando (manualmente), colocar em um script para executar junto com o boot, colocar uma chamada crontab ou outro meio que achar melhor.

(Com quebra de linha \ para evitar erros na copia e melhor visualização)

  #!/bin/bash
  horacerta=`lynx -dump \
  http://pcdsh01.on.br/ispy.asp|grep 'Bras'\
  |tr -s " " |cut -d" " -f4`
  date -s $horacerta
  echo $horacerta

Faça testes com a linha (date -s $horacerta) comentada, assim não altera a hora do sistema, veja o resultado, deve exibir a hora certa no console, quando a variável $horacerta retorna vazia (não exibie a hora), indica que não acessou o servidor ou ocorreu outra falha qualquer.

Requer o pacote lynx e acesso a internet, qualquer falha verifique se a maquina acessa internet, regras de firewall, proxy e outras restrições.

ssh sincronizar hora com outra maquina

Sincronizar a hora via ssh, mais uma "gambi".

Considere montar um servidor de hora em usa rede, assim as demais maquinas, até mesmo as sem acesso à net pode sincronizar a hora via NTP com este servidor interno.

Em maquinas sem acesso a internet, pode usar ssh para pegar a data de outra maquina da rede, tudo em uma linha de comando, fazendo alguns testes com ssh para executar comando remoto, resolvi testar esta opção e funcionou, achei interessante acrescentar aqui como solução para pegar a hora de maquina remota, pode até ser útil como exercicio sobre ssh.

Tutoriais e mais dicas sobre ssh, procure no menu.html (Página principal).

  Linha de comando para testar, mostrar hora da maquina remota no console local.
  
  horacerta=`ssh zago@192.168.1.2 'date |tr -s " " |cut -d" " -f4'` && echo -s $horacerta
  Password:
  22:23:29
  
  Linha de comando para alterar a hora local com base na hora de outra maquina 
  
  horacerta=`ssh zago@192.168.1.2 'date |tr -s " " |cut -d" " -f4'` && date -s $horacerta

Alterar a hora da maquina remota, faça a conexão ssh e execute o comando no console da maquina remota, nesta ordem.

  ssh zago@192.168.1.120
  tornar root e executar 
  horacerta=`ssh zago@192.168.1.53 'date |tr -s " " |cut -d" " -f4'` && date -s $horacerta

Carregar variável local para usar seu conteúdo em console de maquina remota falhou, chega zerada, sem conteúdo. Poderia salvar em aquivo, copiar e tal, mas isto aumenta o atrazo. Até agora a solução que funcionou foi o exemplo acima. Não dei importancia a isto porque se trata de testes com ssh, não uso este recurso para acertar hora.

hora certa (linha de comando)

Somente o superusuário (root) pode acertar o relógio do sistema, pode ser via linha de comando, script ou serviços próprios como NTP, ntpdate e outros...

Dependendo do perfil de instalação tem ferramentas em ambiente gráfico de forma mais amigável, como exemplo no KDE, basta um clique com botão auxiliar sobre a hora que está no canto inferior da tela, selecione ajustar, informe a senha e root e pronto.

Procure também pela ferramenta de configuração da sua distro, como yast no SUSE.

Tem muitas opções, pode ser via ssh em conexões remotas, scripts, linha de comando ou serviços especificos como NTP para acertar hora.

Neste tópico tem varias dicas, veja qual delas lhe atende melhor.

date sem parametros exibe data e hora atual, retorna algo neste formato.

Jun 13 23:31:58 BRT 2006

Acetar data e hora em modo texto - bash - shell:

acertar data e hora, faça isso como root

date -s hh:mm:ss mm/dd/aaaa

OU

date -s 22:35 -> altera a hora do sistema

date -s 2002-06-13 -> altera da data do sistema

clock -w -> no CL10 e CentOS 5 grava as alterações de (date -s) na BIOS.

hwclock -a -> no Kubuntu 7.04 e SUSE 10.2

Procure qual deles faz parte dos pacotes de sua distro.

formato de data nos logs e conversão

Sistemas Linux (unix) utiliza 8 bytes para o timestamp, datas no formato 1085173079.594 representam o numero de seguntos e milesimos de segundo decorridos a partir de 1/1/1970, portanto, data codificada em unixtime

date +%s

colocar em variável ou converter data atual para segundos <UNIXTIME>

  MDATAU=$(date +%s)
  echo $MDATAU
  1151773928

Este formato de gravar a data é comum nos logs, por exemplo, no inicio da linha de log do Squid aparece um numero semelhante a: 1085173079.594

Este numero representa a data e hora no formato *nix, converter esta data para hora humana, por exemplo, nos log do Squid a data vem neste formato: 1085173079.594, o que vem depois do ponto são milesimos de sengundo que não interessa na data, mesmo porque não usamos este formato de tempo, pra fazer a conversão elimine o ponto e o que vem depois dele, o formato da linha de comando é este:

date --date='1/1/1970 + <UNIXTIME> seconds'

por exemplo, converter a data 1085173079.594, execute esta linha de comando:

date --date='1/1/1970 + 1085173079 seconds'

Veja o resultado:

  [zago@faqcl9 zago]$ date --date='1/1/1970 + 1085173079 seconds'
  Sex Mai 21 20:57:59 UTC 2004
  
  Veja como o resultado é diferente em: GMT, BRST, UTC
  
  [zago@faqcl9 zago]$ date --date="01/01/1970 UTC 1085173079 seconds"
  Sex Mai 21 20:57:59 UTC 2004
  
  [zago@faqcl9 zago]$ date --date="01/01/1970 BRST 1085173079 seconds"
  Sex Mai 21 22:57:59 UTC 2004
  
  [zago@faqcl9 zago]$ date --date="01/01/1970 GMT 1085173079 seconds"
  Sex Mai 21 20:57:59 UTC 2004

A diferença de 2 ou 3 horas ocorre conforme a configuração do locale, acerte isto nas configurações de fuso horario, leve em consideração o fuso horario e horario de verão.

Exemplo em perl, data 1085173079.594 no formato Linux (unix), converter para o formato humano

perl -e "print scalar localtime(shift||1085173079.594)"

  [zago@faqcl10 zago]$ perl -e "print scalar localtime(shift||1085173079.594)"
  Fri May 21 20:57:59 2004

Inverso, transformar a data em segundos no formato *nix, faça testes com as linhas de comando abaixo, pegue o resultado da primeira linha de comando e substitua na segunda.

  awk 'BEGIN {srand(); printf("%d\n", srand())}'
  1085173079
  
  date --date='1/1/1970 + 1085173079 seconds'
  Sex Mai 21 20:57:59 BRT 2004

Salvar a data do sistema em arquivo

  echo `date` >> /tmp/arqlog.txt
  Sex Jul  7 00:13:44 BRT 2006
  
  Mensagem mais a data.
  
  echo "Comando executado em: `date`" >> /tmp/arqlog.txt
  Comando executado em: Sex Jul  7 00:13:44 BRT 2006

Trabalhando com data diferente do sistema.

Pegar o dia da semana na data do sistema.

echo `date +%A`

trabalhar com data diferente do sistema.

echo `date --date=20050101 +%d%m%Y`

Exemplo para retornar somente o nome do dia da semanda de data especifica.

  echo `date --date=20050101 +%A`
  sábado
  
  echo `date --date=20060101 +%A`
  domingo

Alguns exemplos com data diferente da ataul.

Data de ontem.

echo `date -d yesterday "+%Y%m%d"`

DONTEM=`date -d yesterday "+%Y%m%d"`

cole na linha de comando os exemplos abaixo e compare os resultados. Passar o resultado para variável, siga a dica acima.

exibir a data atual

date

data de ontem.

date --date yesterday

data de amanhã

date --date tomorrow

Observe as diferenças nos comandos abaixo, data atual mais um dia, mais um mês, menos um dia, mais um mês e menos um dia e etc...

(ago) retorna data no passado, (1 day ago) é igual a ontem, tem o mesmo resultado que (-1 day), (3 day ago) retorna data de 3 dias passados e assim por diante, também se aplica a mes, ano, hora e minutos.

  day   = dia
  week  = semana
  month = mês
  year  = ano
  ago   = passado
  hours = horas
  minutes = minutos
  

sinal (-) retorna data no passado, sinal mais ou omitido retorna data no futuro.

echo `date --date '1 day'`

echo `date --date '1 day ago'`

date --date='1 days ago'

echo `date --date '3 day ago'`

echo `date --date '-1 day'`

echo `date --date '1 month'`

echo `date --date '1 month ago'`

echo `date --date '-1 month'`

echo `date --date '1 month -1 day'`

echo `date --date '1 day' +%d`

echo "date -d +1 month"

Com data formatada,

date +%Y%m%d --date='1 days ago'

Informando a data inicial.

date -d "2004/6/13 +1 month -1 day"

echo `date -d "2004/6/13 +1 month -1 day"`

com data dentro de variáveis.

  mano=2004
  mmes=6
  mdia=13
  echo `date -d "$mano/$mmes/$mdia +1 month -1 day"`

Data de ontem em variavel.

MONTEM=`date -d yesterday "+%Y%m%d"`

MONTEM=$(date --date "- 1 day " +%Y%m%d)

MONTEM=$(date --date "1 day ago " +%Y%m%d)

echo $MONTEM

20040612

Daqui a uma semana

datateste=`date -d week "+%Y%m%d"`

echo $datateste

Daqui a um mes:

datateste=`date -d month "+%Y%m%d"`

echo $datateste

Outro formato de obter data futura ou passada.

  
  date
  Ter Jun  13 00:01:41 BRT 2006
  
  MDATA=$(date --date "0 day " +%d.%m.%Y)
  echo $MDATA
  13.06.2006
  
  MDATA=$(date --date "0 day " +%d-%m-%Y)
  echo $MDATA
  13-06-2006
  
  MDATA=$(date --date "0 day " +%d%m%Y)
  echo $MDATA
  13062006
  
  MDATA=$(date --date "0 day " +%Y%m%d)
  echo $MDATA
  20060613
  
  MDATA=$(date --date "2 day " +%d/%m/%Y)
  echo $MDATA
  15/06/2006
  
  sinal - equivale a (ago), passado.
  
  MDATA=$(date --date "- 2 day " +%d/%m/%Y)
  echo $MDATA
  11/06/2006
  
  MDATA=$(date --date "2 day ago " +%d/%m/%Y)
  echo $MDATA
  11/06/2006
  
  MSEMPAS=`/bin/date -d "7 day ago"`
  echo $MSEMPAS
  Ter Jun  6 00:01:41 BRT 2006

script - comparar hora ou data

Comparar hora, pegar hora e minuto e comparar com resultado fixo.

Tem muitas maneiras de fazer esta comparação, pode converter para hora unix para fazer as operações, ou trabalhar com variaves contendo a hora e minuto.

exemplo para saber se hora atual é maior que 22 horas, neste exemplo passa hora e minutos sem os dois pontos, 22:00 é representada neste formato 2200, neste script compara a hora atual na variável $HATUAL com 2200 para saber se está executando antes ou depois das 22 horas, os modelos de script podem ficarem no /etc/cron.hourly, assim o sistema testa de hora em hora e executa as tarefas, inclua seus comandos de backup, gerar relatórios e outras tarefas.

  #!/bin/bash
  HATUAL=`date +%H%M`
  if [ $HATUAL -gt 2200 ]; then
    #seus comandos aqui
    echo $HATUAL
  else 
    echo "backup somente depois das 22:00"
  fi

Outro exemplo com o mesmo resultado acima.

  #!/bin/bash
  HATUAL=$(date +%H%m)
  if [ "$HATUAL" -gt "2200" ]; then
    echo " já passa das 22:00 "
  else 
    echo "ainda não são 22:00 "
  fi

Considere trabalhar com os segundos, facilita nos calculos...

date '+%s'

script com hora para iniciar e parar, copia do script para rodar bittorrent somente entre as 19:00 e 07:00 horas.

  #!/bin/bash
  HATUAL=`date +%H`
  if [ $HATUAL = "19" ]; then
    #seus comandos aqui, exemplo para download SUSE 10.1 em 5 CD.
    cd /tmp
    btdownloadheadless --url http://download.opensuse.org/distribution/SL-10.1/SUSE-Linux-10.1-GM-i386.torrent
  fi
  # matar o processo, faça testes para descobrir qual das opções abaixo
  # funciona em sua instalção. Comente as não usadas.
  if [ $HATUAL = "07" ]; then
    killall -9 btdownloadheadless 
    pkill python
    pkill btdownloadheadless
  fi

Outros exemplos de variáveis com hora e minutos.

MHORA=$(date +%R)

12:53

Ideal para salvar junto mensagens em arquivo.

echo "status em $MHORA retorno $?" >> /tmp/arqlog.txt

comparar datas

Comparar duas datas para saber qual é mais recente.

Existem diversas maneiras de fazer esta comparação, pode quebrar em partes e comparar o dia, mes, ano e etc.

Neste documento tem um exemplo para comparar somente a hora, pode aplicar o principio dele na comparação de outros periodos de tempo como mes e ano.

Acho mais prático converter para segundos <UNIXTIME> e comparar o numero de segundos para descobrir qual deles é maior, ou seja qual a data mais recente.

Exemplo de script para esta comparação, use para alterar variáveis de seu script, insira seus comandos em lugar do echo...

  #!/bin/bash
  MDATA1="2004-06-13"
  MDATA2="2005-06-21"
  if [ `date --date=$MDATA1 +"%s"` -eq `date --date=$MDATA2 +"%s"` ]
  then
          echo "datas iguais, $MDATA1 é iqual a $MDATA2"
  elif [ `date --date=$MDATA1 +"%s"` -lt `date --date=$MDATA2 +"%s"` ]
  then
          echo "$MDATA1 É data anterior a $MDATA2"
  else
          echo "$MDATA1 é data posterior a $MDATA2"
  fi

Caso procure por resultado especifico, se deseja saber somente se é anterior ou posterior, pode simplificar o script, altere o comparador, faça testes com -lt, -gt, -eq -ge, -le, -ne e outras formas de compararação.

  #!/bin/bash
  MDATA1="2004-06-13"
  MDATA2="2005-06-21"
  if [ `date --date=$MDATA1 +"%s"` -lt `date --date=$MDATA2 +"%s"` ]
  then
  echo "$MDATA1 É data anterior a $MDATA2"
  fi

Outro exemplo para comparar com data atual, altere a variável $MDATAVAR com a data que deseja comparar

  #!/bin/bash
  MDATAVAR="2004-06-13"
  DATUAL=`date`
  #DATUAL=`date +%d%b%y`
  #DATUAL=$(date +%d%b%y)
  #DATUAL=`date -I`
  
  if [ `date --date=$MDATAVAR +"%s"` -eq `date --date=$DATUAL +"%s"` ]
  then
          echo "datas iguais, $MDATAVAR é iqual a $DATUAL"
  elif [ `date --date=$MDATAVAR +"%s"` -lt `date --date=$DATUAL +"%s"` ]
  then
          echo "$MDATAVAR É data anterior a $DATUAL"
  else
          echo "$MDATAVAR é data posterior a $DATUAL"
  fi

testar data (conferir se é válida ou não)

MDATAVAR="20040613"; [ `date -d $MDATAVAR +%Y%m%d` == $MDATAVAR ]&&echo data válida e OK

Retornando "data válida e OK" então está OK, sem retorno indica que a data não válida.

Cuidado que mesmo com dada válida pode não retornar a confirmação por diversos motivos, como exemplo não retorna OK no exemplo abaixo, basta remover os (-) ou incluir na parte que faz a comparação como no exemplo logo a seguir.

MDATAVAR="2004-06-13"; [ `date -d $MDATAVAR +%Y%m%d` == $MDATAVAR ]&&echo data válida e OK

Ou incluir os (-) no formato de saida

MDATAVAR="2004-06-13"; [ `date -d $MDATAVAR +%Y-%m-%d` == $MDATAVAR ]&&echo data válida e OK

Testar data em variáveis.

  MDATAVAR="20040613"
  echo $MDATAVAR; [ `date -d $MDATAVAR +%Y%m%d` == $MDATAVAR ]&&echo data válida e OK
  20040613
  data válida e OK

nomear arquivos com data e hora

Nome do arquivo com a data atual.

Nomear arquivos com a data atual no nome do arquivo, use este formato:

tar -zcvf Linux-BR-FAQ-`date +%d.%b.%Y`.tar.gz /home/zago/guiaz

A linha acima cria no diretório local o arquivo:

Linux-BR-FAQ-08.Ago.2004.tar.gz

Este comando foi executado no dia 08 de agosto de 2004, note que foi substituido no comando "`date +%d.%b.%Y`" por: "08.Ago.2004" que é a data atual.

Incluir também a hora e minutos, não inclua ":" nem "/" como separador porque são simbolos e podem ser usados em nome de arquivos, mais alguns exemplos.

tar -zcvf Linux-BR-FAQ-`date +%d.%b.%Y-%H-%M`.tar.gz /home/zago/guiaz

a linha de comando acima acrescenta no nome do arquivo também a data e hora atual, veja o resultado:

Linux-BR-FAQ-08.Ago.2004-17-14.tar.gz

tar -zcvf Linux-BR-FAQ-`date +%d%m%y`.tar.gz /home/zago/guiaz

A linha acima cria no diretório local o arquivo:

Linux-BR-FAQ-080804.tar.gz

Variável com nome de arquivo mais data.

  MARQUIVO=`date +'guiaz-%d-%b-%Y.tar.gz'`
  tar -zcvf $MARQUIVO /home/zago/guiaz
  
  ls
  guiaz-08-Ago-2004.tar.gz

Exemplo de script para criar arquivo no formato aquivo+ano+mes+dia do sistema (`date +%Y%m%d`), nomear arquivos neste formato dadosdbf-20070613.tar.gz

  find /home/samba/bcodados/*.dbf | tar zcvf dadosdbf-`date +%Y%m%d`.tar.gz -T - --exclude="/home/samba/bcodados/locmod.dbf"
  scp  dadosdbf-`date +%Y%m%d`.tar.gz zago@192.168.1.2:~/
  rm -rf sdbf-`date +%Y%m%d`.tar.gz

Cuidado com a virada do dia, script que inicia antes e termina depois da meia noite, nestes casos crie a variável no inicio do script contendo a data, trabalhe com ela do inicio ao fim para evitar erros no nome do arquivo

Consulte o manual, man date

Tem outras opções de datas e formatos, tais como; incluir a hora no formato de 12 horas, com ou sem o zero a esquerda e muito mais, incluir o nome do dia da semana, veja o formato desejado e substitua neste exemplos.

Muito útil em scripts de backup, organiza e evita que o novo arquivo sobrepoe o já existente

Tenha o cuidado com o sinal "`", prefira copiar e colar.

As dicas acima funcionam também com outros aplicativos como gzip, mkdir e muitos outros.

criar diretórios com data e hora

Criar diretório com a data de criação no nome, exemplos de comandos e resultados:

echo Linux-BR-FAQ-`date +%d.%b.%Y-%H-%M` | xargs mkdir

  [zago@faqcl10 teste]$ echo Linux-BR-FAQ-`date +%d.%b.%Y-%H-%M` | xargs mkdir
  [zago@faqcl10 teste]$ ls
  Linux-BR-FAQ-08.Ago.2004-17-14 
  
  [zago@faqcl10 teste]$ echo Linux-BR-FAQ-`date +%d%b%y` | xargs mkdir
  [zago@faqcl10 teste]$ ls
  Linux-BR-FAQ-08Ago04
  
  [zago@faqcl10 teste]$ date +%d%b%y | xargs mkdir
  [zago@faqcl10 teste]$ ls
  08Ago04

Mais exemplos para scripts:

  #!/bin/bash
  mkdir `date +%d%b%y`

Nome de diretório mais a data:

  #!/bin/bash
  DATA=$(date +%d%b%y)
  mkdir meubackup$DATA

Altere a formatação da data como preferir, consulte o manual do comando "date".

Faça testes com echo, algo no formato

  echo `date +%d-%m-%y" "%H-%M`
  13-06-06 17-03

Faça testes com outras opções e altere as posições das variaveis até encontrar o resultado desejado.

Tem exemplos com mais detalhes no FAQ, tar.html e backup3.txt

Backup com arquivo nomeado com o dia da semana.

  DATA=`date +%A`
  tar -zcvf /home/caminho/arquivo-$DATA.tar.gz /home/dir_origem

Assim pode salvar o backup no mesmo diretório, como o arquivo tem o dia da semana no nome, mantém copia para cada dia da semana.

No mesmo dia da semana seguinte o arquivo será sobrescrito.

Criar arquivo com data e hora de criação no nome.

touch `date +%Y%m%d%H`-arqteste.txt

tar -zcvf guiaz-`date +%d%m%y`.tar.gz /home/zago/guiaz

Pode criar variáveis para montar o nome do arquivo.

  MNOME="meubackup"
  MDATA=$(date +%d_%m_%Y-%H-%M)
  MARQ=${MNOME}-${MDATA}
  
  echo ${MARQ}

passar a data para variáveis

Colocar a data do sistema em uma variavel veja alguns exemplos abaixo, para testar, exibir o conteúdo da variável, execute echo $variavel.

formato dia mes e ano

DATUAL=`date +%d%b%y`

ou trocando %b por %m

DATUAL=`date +%d%m%Y`

formato ano mes e dia

DATUAL=`date +%Y%m%d`

Faça testes e use echo $varialvel para ver o conteúdo da variável.

echo $DATUAL

Ou use echo para exibir o resultado direto no console.

echo `date +%Y%m%d`

MDATA=$(date +%d%b%y)

echo $MDATA

Faça testes, edite as linhas acima, copie e cole no console, deve obter resultados semelhantes a este.

  [zago@zago zago]$ DATA_ATUAL=`date -I`
  [zago@zago zago]$ echo $DATA_ATUAL
  2002-11-23

Variável com nome de arquivo mais data, alguns exemplos de formato.

  MARQUIVO=`date +'arqback-%d-%b-%Y.tar'`
  MARQUIVO=`date +'guiaz-%d-%b-%Y.tar.gz'`
  MARQUIVO="arqback-"$(date +%d-%b-%Y)

date +%s

  MDATAU=$(date +%s)
  echo $MDATAU
  1151773928

  MDATA=`date +%Y%m%d%H%M%S`
  echo $MDATA
  20060701171519
  MDIA=${MDATA:6:2}
  MMES=${MDATA:4:2}
  MANO=${MDATA:0:4}
  MHORA=${MDATA:8:2}
  MMINUTO=${MDATA:10:2}
  MSEGUNDO=${MDATA:12:2}
  
  criar variável com dados parciais da data
  
  MVARDATA="$MANO$MMES$MDIA"
  
  Conferir, mostrar o conteúdo das variáveis.
  
  echo $MVARDATA
  
  echo $MHORA

Também pode usar ferramentas como cut e awk, como chama mais um processo, consome mais CPU e processamento, insignificante mas consome, mesmo assim segue uma dica com cut.

  MDIA=`date | cut -c 9-10`
  MMES=`date | cut -c 5-7`
  MANO=`date | cut -c 25-28`
  
  echo $MDIA

Formatar data a partir de variável.

  MVARDATA=13Jun2004
  date -d $MVARDATA +%Y-%m-%d
  2004-06-13

Pegar somente o dia em formato numero ou por nome.

MDIA=$(date +%d)

MDIA=$(LANG=pt_BR date '+%A')

Pegar o dia sem o zero a esquerda nos dias entre 01 a 09

MDIA=$(date --date="$((`date +%d`-1))")

MDIA=$((date --date="$((`date +%d`-1))")|cut -d" " -f4)

MDIA=$((LANG=pt_BR date --date="$((`date +%d`-1))")|cut -d" " -f4)

A coluna correta no cut é f3, mas tem um espaço a mais e retorna vazio, para não usar tr para remover espaço, prefiro pegar a posição 4, em sua instalação pode ocorrer outros problemas quanto a isto, faça testes com f3 que deve funcionar quando falhar f4.

date --date="$((`date +%d`-1))"

Outros exemplos de resultados..

Variável com data do dia primeiro do mes corrente.

date +01%m%Y

MDATA="01-$(date +%m-%Y)"

dia da semana

Abreviatura do dia no formato

seg ter qua qui sex sáb dom

MDIA=$((LANG=pt_BR date '+%A')| cut -c0-3)

echo $MDIA

seg

Abreviatura do dia no formato.

Seg Ter Qua Qui Sex Sáb Dom

MDIA=$(echo `LANG=pt_BR date` | cut -d" " -f1)

echo $MDIA

Seg

Atenção! muito cuidado com esta variável em script no crontab.

Detectei problemas em algumas instalações do CL10, não testei mas acho que pode ocorrer em qualquer distro porque está relacionado ao idioma. script que funciona quando executado manualmente, falha quando executado via crontab, retorna o dia da semana em português em linha de comando ou executando o script manualmente, no crontab pega o dia em inglês, retorna (mon) em lugar de (seg), com uso do (LANG=pt_BR) resolve o problema de script agendado no crontab.

Isto depende das configurações de idioma e do sistema, caso tenha problemas, a dica é colocar uma linha no script para salvar o conteúdo da variável em arquivo, ajuda depurar o problema e detectar o conteúdo da variável no script rodando pelo cron.

Caso tenha problema com o idioma, pode trabalhar com numero do dia da semana e usar uma tabela no case para converter, assim independe do idioma do sistema, prefiro e utilizo este sistema, caso altere o idioma o script continua funcionando, veja exemplos abaixo, um deles tem a tabela de conversão do numero dia para dia abreviado.

Exemplo com "case", execute após a linha de criação da variável.

  HOJE=$((LANG=pt_BR date '+%A')| cut -c0-3)
  case $HOJE in
   mon) HOJE=seg ;;
   tue) HOJE=ter ;;
   wed) HOJE=qua ;;
   thu) HOJE=qui ;;
   fri) HOJE=sex ;;
   sat) HOJE=sab ;;
   sáb) HOJE=sab ;;
   Sáb) HOJE=sab ;;
   sun) HOJE=dom ;;
   Mon) HOJE=seg ;;
   Tue) HOJE=ter ;;
   Wed) HOJE=qua ;;
   Thu) HOJE=qui ;;
   Fri) HOJE=sex ;;
   Sat) HOJE=sab ;;
   Sun) HOJE=dom ;;
  esac

Ou se preferir, trabalhe com número do dia da semana, altere a tabela acima para converter de numero para dia abreviado, veja exemplo abaixo.

Pegar no formato de numero do dia da semana, echo `date +%u` retorana o numero do dia;

echo `date +%u`

4

Onde:

  1=segunda
  2=terça
  3=quarta
  4=quinta
  5=sexta
  6=sábado
  7=domingo

Colocar em váriavel para trabalhar em script.

MNUMDIA=$(echo `date +%u`)

echo $MNUMDIA

Tabela com case para converter o numero do dia para dia da semana abreviado.

  HOJE=$(echo `date +%u`)
  case $HOJE in
   1) HOJE=seg ;;
   2) HOJE=ter ;;
   3) HOJE=qua ;;
   4) HOJE=qui ;;
   5) HOJE=sex ;;
   6) HOJE=sab ;;
   7) HOJE=dom ;;
  esac

Em script de backup, pode usar o numero do dia em "if" para escolha de rotinas especiais, alternar a maquina de backup, HD ou até mesmo não executar o script em dias que não precisa de backup, como 7 para domingo e 6 para sábado, veja exemplos de script no tutorial sobre if.

http://www.zago.eti.br/script/if.html

A conversão com case acima é somente um sugestão, existem n maneiras de chegar ao mesmo resultado, também pode ser aplicada na conversão de nome do mes.

OBS. No manual do CL 10 não tem %u mas pode usar que funciona, indica uso de %w que retorna o resultado de zero a 6, no manual do SUSE não tem %w mas funciona.

Prefira trabalhar somente com %u que retorna de 1 a 7. Tanto CL e SUSE o resultado de %u é de 1 a 7, 1=segunda e 7=domingo, portanto verifique na sua instalação qual o retorno para domingo..

  No manual do SUSE 10 %u 
  
   %u     day of week (1..7);  1 represents Monday
  
  no manual do CL10  %w
  
  %w     dia da semana (0..6) com o 0 correspondendo ao Domingo;

campos de tempo

Normalmente as páginas do man estão em inglês, no CL 10 está traduzida, para facilitar segue cópia parcial, tradução dos campos do date, retirado do manual (man date) no CL 10, consulte também o man da sua instalação.

         Campos de Tempo:
  
         %H     hora (00..23);
  
         %      hora (01..12);
  
         %k     hora (0..23);
  
         %I     hora (1..12);
  
         %M     minuto (00..59);
  
         %p     período local AM ou PM;
  
         %r     tempo, 12-horas (hh:mm:ss[AP]M);
  
         %s     segundos  desde  1970-01-01  00:00:00  UTC  (uma  extensão   não
                padrão);
  
         %S     segundo (00..61);
  
         %T     tempo, 24-horas (hh:mm:ss);
  
         %X     representação do tempo local (%H:%M:%S);
  
         %Z     zona  de  tempo  (por  exemplo:  EDT  (Easterm Day Time)[horário
                diurno do leste], ou nada se nenhuma zona for determinada);
  
  
         Campos de Data:
  
         %a     nome do dia da semana local abreviado (Dom..Sab);
  
         %A     nome  do  dia  da  semana  local  completo,   tamanho   variável
                (Domingo..Sábado);
  
         %b     nome do mês local abreviado (Jan..Dez);
  
         %B     nome  do  mês  local completo, tamanho variável (Janeiro..Dezem-
                bro);
  
         %c     data e hora local (Sab Nov 04 12:02:33 EST 1989);
  
         %d     dia do mês (01..31);
  
         %D     data (mm/dd/yy);
  
         %h     o mesmo que %b;
  
         %j     dia do ano (001..366);
  
         %m     mês (01..12);
  
         %U     número da semana no ano com Domingo como o primeiro dia da  sem-
                ana (00..53);
  
         %w     dia da semana (0..6) com o 0 correspondendo ao Domingo;
  
         %W     número da semana no ano com Segunda-feira como o primeiro dia da
                semana (00..53);
  
         %x     representação da data local;
  
         %y     últimos dois dígitos do ano (00..99);
  
         %Y     ano (1970...).
  
         -      (hífen) - não complete o campo.
  
         _      (Sublinhado) - completa o campo com espaços.
  
         Se  for  dado  algum  argumento que não comece com ´+´, o date acerta o
         relógio do sistema com o tempo e data especificados pelo argumento.   O
         argumento deve consistir somente de dígitos, que tenham o seguinte sig-
         nificado:
  
         MM     mês;
  
         DD     dia dentro do mês;
  
         hh     hora;
  
         mm     minuto;
  
         CC     primeiros dois dígitos do ano (opcional);
  
         YY     últimos dois dígitos do ano (opcional);
  
         ss     segundos (opcional);

Observação retirada do man date no CL10

  para   os  primeiros   nove dias  do mês, o ´%d´ se expande para um campo de dois dígitos completados com zero; por exemplo, ´date -d 1-may´+%B%d´´ imprimirá: ´May  01´.
  
  Para imprimir a mesma data, mas, sem o zero inicial para dias do mês de um dígito, você  pode  utilizar  o  modificador  não  padrão  ´-´  para suprimi-lo.
  
                date -d 1-may´+%B %-d

identificar ultimo dia do mes

ultimo dia do mes, verificar se hoje mais um dia é igual a 01 dia primeiro.

echo `date --date '1 day' +%d`

retorna o dia seguinte, portanto quando retornar "01" indica que o dia atual é o ultimo dia do mes.

Usando em um if para testar se o dia atual é o último do mes e tomar decisão..

  #!/bin/bash
  DIAMAIS1=`date --date '1 day' +%d`
  if [ "$DIAMAIS1" == "01" ]; then
    echo " Fim do mes."
    # seus comandos de backup e rotinas de final de mes.
  else 
    echo "ainda não é o fim do mes."
  fi

data nos arquivos

Para entender melhor, aplique os comandos abaixo em arquivo já existente, depois acesse o arquivo e veja o resultado novamente.

Última modificação

echo `find arquivo.txt -printf %Td/%Tm/%TY`

Última modificação de estatus

echo `find arquivo.txt -printf %Cd/%Cm/%CY`

Último acesso

echo `find arquivo.txt -printf %Ad/%Am/%AY`

Exibir também hora e minutos, acrescente um espaço como separador mais " "%AH:%AM, observe que muda o formato do parametro.

echo `find arquivo.txt -printf %Ad/%Am/%AY" "%AH:%AM`

em lugar de arquivo.txt pode usar curingas, arq*.*, arquivo.*, *.txt

time - cronometro

O utilitário 'time' é usado como uma espécie de cronômetro para medir o tempo de execução de um comando especificado. Ele pode ajudar na otimização de programas para velocidade máxima, como exemplo comparar o tempo de de rotinas em scripts para executar a mesma tarefa com aplicativos diferente, algo que possa fazer com cat+cut e também com sed, awk e outros. Use o time para contar o tempo de cada um e descobrir com qual deles pode executar a tarefa em menos tempo.

Procure no seu gerenciador de pacotes pela instalação do time

Contar o tempo decorrido para executar uma tarefa. exemplos:

Faz a pesquisa e exibe também o tempo decorrido

time grep "comandos.txt" -r /home/zago/guiaz/

Exemplo pra conferir o md5 e o que retorna:

  time sh -c 'md5sum -c cl10_cd1.iso.md5'
  cl10_cd1.iso: A soma coincide
  
  real    0m16.495s
  user    0m3.097s
  sys     0m1.914s

Exemplo pra retornar somente o tempo decorrido:

  time sh -c 'md5sum -c cl10_cd1.iso.md5' > /dev/null
  
  real    0m17.000s
  user    0m3.049s
  sys     0m1.930s

Veja mais parametros no manual:

    man time
    man wait
    man times
    man bash

hora na BIOS - acertar com clock ou hwclock

Muitas vezes precisamos acertar a hora da BIOS, podemos acessar a mesma reiniciando a maquina, mas isto pode ser inviável em servidores ou maquinas sem teclado e monitor, considere fazer via console ou via software remotamente, um exemplo bem prático é via ssh, basta fazer uma conexão, acetar a hora do sistema depois acertar a hora da BIOS com a hora do sistema.

A melhor solução é acertar a hora do sistema via NTP, tem exemplos neste tuturial, quando não for possível, tente sincronizar via ssh com outra maquina da rede, também tem exemplos neste tutorial, quando não for possível também, resta informar a hora na linha de comando como neste exemplo

date -s 17:52:25

retorna

Ter Mai 8 17:52:25 BRT 2007

No exemplo acima alterou a hora somente do sistema, deve funcionar em qualquer distro. Acertar a hora da BIOS requer mais um comando, como este segundo comando é diferente em algumas distribuições, segue exemplos especificos que testei.

Considerando que já acertou a hora do sistema, para acertar também na BIOS execute conforme a distro.

CentOS 5.0, CL10

clock -w

Kubuntu, SUSE 10.2

hwclock -a

Mais exemplos nas páginas do manual

man date mostra manual do date, veja a informação sobre -s

         -s datestr, --set datestr
                Acerta a hora e data para datestr a qual, pode estar em qualquer
                formato comum.  Pode conter nomes de mês, zonas de tempo, ´am´ e
                ´pm´, etc..

man hwclock mostra página do manual

hdclock

O arquivo de configuração da data e hora no CL fica em: /etc/init.d/clock

Este script chama: /sbin/hwclock

Altera a data e hora também na bios, aceita varios parametros, nele é definido a zona de horario e outros detalhes relacionados a data e hora, veja mais com:

Veja a localização correta na sua distro, a seguir alguns resultados no CL

  [root@zago sbin]# hwclock --help
  hwclock - query and set the hardware clock (RTC)
  
  Usage: hwclock [function] [options...]
  
  Functions:
    --help        show this help
    --show        read hardware clock and print result
    --set         set the rtc to the time given with --date
    --hctosys     set the system time from the hardware clock
    --systohc     set the hardware clock to the current system time
    --adjust      adjust the rtc to account for systematic drift since
                  the clock was last set or adjusted
    --getepoch    print out the kernel's hardware clock epoch value
    --setepoch    set the kernel's hardware clock epoch value to the
                  value given with --epoch
    --version     print out the version of hwclock to stdout
  
  Options:
    --utc         the hardware clock is kept in coordinated universal time
    --localtime   the hardware clock is kept in local time
    --directisa   access the ISA bus directly instead of /dev/rtc
    --badyear     ignore rtc's year because the bios is broken
    --date        specifies the time to which to set the hardware clock
    --epoch=year  specifies the year which is the beginning of the
                  hardware clock's epoch value
    --noadjfile   do not access /etc/adjtime. Requires the use of
                  either --utc or --localtime

timezone

Pra acertar fuso horario, como root em um terminal digite:

timeconfig

Selecione a cidade região mais proxima da sua localidade.

Este pacote não vem em todas as distro, vem no CL10 e não vem no SUSE 10, No SUSE use o Yast, tem versão em ambiente gráfico e modo texto, em conexões remotas via ssh ou em modo texto, execute yast, entre em "Sistema" depois em "Data e Hora" e faça as alterações.

Conferir o timezone, execute; "date +%z", veja o resultado

  zago@suse64:~> date +%z
  -0300

cal - calendario no shell

cal - exibe um calendário no console o comando cal sem parametros mostra o calendario do mes corrente

cal 6 2003 # exibie o calendario do mes de junho de 2003

cal 12 2004 # exibie o calendario de dezembro de 2004

Calendario do mes corrente:

cal

Calendario de 3 meses, do mes passado, atual e o proximo

cal -3

cal é instalado pelo pacote: util-linux

Manual: man cal

stat data do arquivo

stat - display file or file system status

stat fornece muita informação sobre arquivo, data, tipo e etc..

veja as opções no manual man stat

stat arquivo retorna informações sobre o arquivo, segue alguns exemplos.

stat ping2

retorna.

    File: `ping2'
    Size: 210             Blocks: 8          IO Block: 4096   arquivo comum
  Device: 802h/2050d      Inode: 121476      Links: 1
  Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
  Access: 2006-06-15 12:15:02.000000000 -0300
  Modify: 2006-06-13 03:54:45.000000000 -0300
  Change: 2006-06-13 03:54:45.000000000 -0300

Pegar somente a data da ultima alteração.

  stat -c %y ping2
  2006-06-13 03:54:45.000000000 -0300

Mais opções, para usar no exemplo acima em lugar de %y

  %x = ultimo acesso
  %X = retorna numero de segundos entre 01.01.1970 e o ultimo acesso
  %y = ultima alteração parece ser igual %z
  %z = ultima modificação, parece que o resultado é igual a %y
  
  Ultima alteração no arquivo
  date --reference=arquivo
  date --reference=z.txt
  
  Ultimo acesso no arquivo
  
  ls --full-time arquivo 
  ls --full-time z.txt 

Opções com find

data do último acesso:

echo `find arquivo -printf %Ad/%Am/%AY`

Veja também estadus e data da última modificação

echo `find arquivo -printf %Cd/%Cm/%CY`

echo `find arquivo -printf %Td/%Tm/%TY`

touch - alterar data de arquivo

para alterar a data de um arquivo use o touch

man touch

touch zago.txt

altera a data do arquivo zago.txt passa a ter a data e hora do sistema no memento da execução do comando.

Indicações

cron e crontab - Programar execução de comandos ou scripts.
http://www.zago.eti.br/agenda.html

data - FAQ com mensagens da Linux-br
http://www.zago.eti.br/data.txt

Uso do find na localização de arquivos por data.
http://www.zago.eti.br/find.html

datas e outras informações de arquivo
http://www.zago.eti.br/script/stat.html

Página principal sobre script em geral (FAQ)
http://www.zago.eti.br/script/A-menu-scripts.html

Página principal deste site (FAQ)
http://www.zago.eti.br/menu.html