
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-10
o 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 find
comando 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 find
a -print0
opção de manipular arquivos com espaços no nome e, opcionalmente, -type f
nã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, xargs
irá invocar seu comando (neste caso tar
) múltiplas vezes conforme xargs
necessá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=ustar
parâmetro para obter um arquivo tar POSIX e, no seu caso, você precisaria canalizar a saída gzip
para 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 find
comando 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 -not
argumento. Você pode então canalizar a saída para xargs
e depois para tar
. Verifique a página man find
para obter detalhes sobre argumentos de tempo.
Atualizar:
Como sugeriu Anthon, você pode usar os modificadores +/- with -mtime
para 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, s
corresponde adias, horas, minutosesegundosrespectivamente. Isso fornecerá arquivos modificados mais recentes 5d2h3m10s
e mais antigos que4d0h15m20s