rsync vários arquivos de vários diretórios no linux

1

Eu tenho vários diretórios nomeados por data (ex: 2017-09-05) e dentro desses diretórios vários arquivos log.gz do BRO IDS. Eu estou tentando entrar em cada diretório e obter apenas arquivos específicos log.gz pelo nome e enviá-los para um sistema remoto usando rsync. Um arquivo de log é assim: dns.00:00:00-01:00:00.log.gz Estou tentando usar curingas para fazer isso.

Ex: rsync -avh --ignore-existing -e ssh -r /home/data/logs/2017-09-* {dns,http}.*.log.gz / [email protected]:/home/pnlogs/

Isto é próximo, mas é apenas copiar todos os arquivos em cada pasta e ignorar minha tentativa de obter apenas registros http e dns como visto no exemplo. Isso é possível fazer em uma linha? Existe um método melhor?

Idealmente, gostaria de manter os arquivos em seus diretórios originais após a transferência. Por exemplo, no meu comando original, os diretórios permanecerão no sistema remoto. Isso seria bom para a organização. Curiosamente, esse comando copiou os registros HTTP e DNS de 2017-09-01 a 2017-09-02, mas não dos dias 3, 4 ou 5 deste mês.

Como eu poderia ajustar isso para levar em conta as alterações no mês / ano? Isso vai ficar em um script e eu não gostaria de ter que mudá-lo todo mês (ou seja, para 2017-10, etc) usando apenas $ date?

Trabalhei com: rsync -avhR $(date +????-??-??)/{dns,http,conn}.*.log.gz [email protected]:/home/pnlogs/ Obrigado por toda a ajuda.

    
por Blitzkrieg 05.09.2017 / 19:50

1 resposta

2

Vamos dar uma olhada no seu comando

rsync -avh --ignore-existing -e ssh -r /home/data/logs/2017-09-*  {dns,http}.*.log.gz / [email protected]:/home/pnlogs/

A fonte de coleta para isso é todos os arquivos (a recursão é ativada com -r - mas, na verdade, -a já faz isso) que corresponde a esses quatro caminhos:

  • /home/data/logs/2017-09-*
  • dns.*.log.gz
  • http.*.log.gz
  • /

O último deles garantirá que o comando rsync tente copiar tudo.

Acho que o que você está querendo copiar é todos os arquivos de log DNS e HTTP dentro das pastas YYYY-MM-DD, mantendo a estrutura do diretório:

cd /home/data/logs &&
rsync -avhR 2017-09-*/{dns,http}.*.log.gz [email protected]:/home/pnlogs/

Eu não usaria --ignore-existing a menos que você tenha um motivo realmente strong para saber que deseja fazer isso. (Esse sinalizador impede que rsync reinicie uma transferência parcial. Lembre-se, você não tem --partial , então talvez isso seja discutível.)

Você não precisa de -r porque está usando -a e esse modo de arquivamento já inclui recursão. Mas, se eu tiver interpretado sua exigência corretamente, não haverá recursão de qualquer maneira.

O sinal -R informa rsync para manter os caminhos relativos das árvores de origem no destino. Eu usei cd para colocar o comando em um ponto de partida útil, porque senão você acabaria com /home/data/logs sendo incluído no caminho de destino. Envolva tudo isso entre parênteses ( ... ) se você quiser evitar que a alteração de diretório seja efetiva para o restante de qualquer script no qual isso seja executado.

    
por 05.09.2017 / 20:06