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

8

Preciso copiar arquivos de log db entre dois servidores suse nos quais estou interessado em arquivos SOMENTE entre 10.3.2013 - 13.3.2013

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

Radek
fonte

Respostas:

12

Como Bichoy indicou, você pode usar o findcomando para encontrar arquivos com um tempo específico de acesso, criação e modificação. No entanto, -mtime assume 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 com -daystart'arredondar' para o início do dia.

Eu acho mais conveniente no seu caso, é a opção -newermt que utiliza uma cadeia de dados (e não o nome de um arquivo de referência como a maioria das versões do -XNew)

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 em que você estiver interessado:

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, xargsinvocará seu comando (nesse caso tar) várias vezes, conforme xargsnecessário para ajustar os argumentos na linha de comando que não são infinitos. Para contornar o que eu sempre uso cpio, que lê nomes de arquivos de stdin. Com o --format=ustarparâmetro para obter um arquivo tar POSIX, e no seu caso, você precisará 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
Anthon
fonte
Posso especificar horas e minutos ao usar seu código?
Radek #
Eu tentei antes de postar meu comentário, mas ... "encontre: não consigo descobrir como interpretar '201302050000' como uma data ou hora" "
Radek
@Radek A resposta curta é Sim. Eu usaria AAAAMMDDThhmm para não precisar lidar com espaços. A resposta longa: Encontre o homem dirá: especificações de tempo são interpretados como para o argumento para a opção -d de data GNU e com data de homem que você vai encontrar... a mostly free format human readable date string ..... A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers
Anthon
@Radek obrigado por apontar o erro, já que não consegui editar meu comentário, reinseri um novo com um Tinserido entre os Dias e as Horas. Que eu testei e funciona. De alguma forma find, não sabe como dividir a string de outra forma (provavelmente porque poderia ser YYMMDDhhmmss em vez de YYYYMMDDhhmm. Pensei que a data precisaria de um ponto para os segundos ( .ss), mas isso provavelmente é apenas para definir a data.
Anthon
4

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

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

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

Onde d, h, m, scorresponde a dias, horas, minutos e segundos, respectivamente. Isso dará aos arquivos modificados mais recentes 5d2h3m10se mais antigos que4d0h15m20s

Bichoy
fonte
2
o argumento para -mtimedeve ser um deslocamento em dias que nem sempre é, a menos que você seja corrigido entre os tempos de execução. Você também pode usar -mtime +Xe -mtime -Xespecificar antes e depois de X dias atrás, em vez de usar -not.
Anthon
Qual seria a sintaxe para especificar data e hora absolutas?
Radek