Como fazer arquivos scp/tar que estão entre dias específicos?

Como fazer arquivos scp/tar que estão entre dias específicos?

Preciso copiar arquivos de log do banco de dados entre dois servidores suse onde estou interessado em arquivos SOMENTE entre 10.3.2013 e 13.3.2013

É desejável compactar os arquivos antes de copiá-los, então eu os tar e o scp. Atualmente estou usando tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10o que me dá todos os arquivos de 10.3.2013 até agora. Mas não preciso de todos eles. E não encontrei nenhuma opção de alcatrão.

Responder1

Como Bichoy indicou você pode usar o findcomando para localizar arquivos com horário específico de acesso, criação e modificação. No entanto, -mtime recebe um deslocamento em incrementos de 24 horas e nem sempre é conveniente calcular, a menos que você queira algo de uma quantidade específica de números de 'dias' atrás. Você precisará combinar isso para -daystart'arredondar' para o início do dia.

Acho que mais conveniente no seu caso é a opção -newermt que usa uma string de data (e não o nome de um arquivo de referência como a maioria das versões -newerXY)

Combine isso com finda -print0opção de manipular arquivos com espaços no nome e, opcionalmente, -type fnão obter nenhum diretório no período de seu interesse:

find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
   -newermt 20130310 -not -newermt 20130314 -type f -print0 \
   | xargs -0 tar -cvzf /tmp/saas_archive_logs.tar.gz 

Há um grande problema com isso: caso o número de arquivos encontrados se torne muito longo, xargsirá invocar seu comando (neste caso tar) múltiplas vezes conforme xargsnecessário para ajustar os argumentos na linha de comando que não é infinita. Para contornar isso eu sempre uso o cpio, que lê nomes de arquivos do stdin. Com o --format=ustarparâmetro para obter um arquivo tar POSIX e, no seu caso, você precisaria canalizar a saída gzippara obter o resultado desejado:

find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
   -newermt 20130310 -not -newermt 20130314 -type f -print0 \
   | cpio --create --null  --format=ustar \
   | gzip > /tmp/saas_archive_logs.tar.gz

Responder2

Você pode verificar o findcomando para obter uma lista dos arquivos que precisam ser tarados. Você pode especificar uma data de início e término (com precisão de até segundos) usando os argumentos normais -atime, -btime, -mtime... em combinação com o -notargumento. Você pode então canalizar a saída para xargse depois para tar. Verifique a página man findpara obter detalhes sobre argumentos de tempo.

Atualizar: Como sugeriu Anthon, você pode usar os modificadores +/- with -mtimepara especificar o período sem usar -not. Aqui está um exemplo:

find . -mtime -5d2h3m10s -mtime +4d0h15m20s -print0 | xargs -0 tar cjvf mytar.tar.bz2

Onde d, h, m, scorresponde adias, horas, minutosesegundosrespectivamente. Isso fornecerá arquivos modificados mais recentes 5d2h3m10se mais antigos que4d0h15m20s

informação relacionada