linhas de comando e scripts com uso de data.
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
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.
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:*
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.
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.
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
Os pacotes e procedimentos são os mesmos nas duas arquiteturas, separei em duas partes, x86_64 configurado manualmente e i386 configurado via yast.
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
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
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)
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.
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)
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
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
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.
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.
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.
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
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
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 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
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
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ó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}
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)"
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;
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
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
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
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
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
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
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 - 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 - 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`
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.