Script bash para backup automático de tar de arquivos e diretórios escolhidos

1

Dentro de um determinado diretório no ambiente linux, eu preciso escolher todos os arquivos modificados após uma certa data (digamos 7 dias) assim como todos os diretórios (somente em diretório raiz, portanto não recursivamente) criado após a mesma data.

Depois disso, eu tenho que cuidar de 3 diretórios, exceto a última regra dada. Para estes, o processo tem que ser recursivo dentro de cada um deles. Em um desses diretórios, há um arquivo a ser excluído, não importa o quê.

Finalmente, tenho que adicionar todos os objetos correspondentes a esses padrões em um único arquivo .tar. Cada arquivo / diretório deve manter o caminho relativo completo dentro do arquivo .tar (a partir do diretório base).

Então, vamos supor que temos:

myHome
|-- normalDir1                  //  older than 7 days
|   |-- blah.txt
|   |-- to_be_excluded_nmw.txt  //  should never be included anyways
|   '-- poems.txt
|-- normalDir2                  //  created yesterday
|   |-- blah2.txt               /*
|   |-- whatever2.txt            *  Since it's a normal directory,
|   |-- whatever3.txt            *  I want to exclude these files from .tar
|   '-- poems2.txt               */  
|-- exceptionDirectory1         //  older than 7 days
|   |-- actions                 //  older than 7 days
|   |   '-- power.sh            //  older than 7 days
|   '-- events                  //  older than 7 days
|       |-- deploy.php          //  older than 7 days
|       '-- set.php             //  older than 7 days
|-- exceptionDirectory2         //  older than 7 days
|   |-- actions2
|   |   '-- power2.sh           //  created yesterday
|   '-- events2                 //  older than 7 days
|       |-- deploy2.php         //  created yesterday
|       '-- set2.php            //  older than 7 days
|-- file_to_be_updated.php      //  created yesterday
'-- file_NOT_to_be_updated.php  //  older than 7 days

o resultado .tar deve conter:

./normalDir2/
./exceptionDirectory2/actions2/power2.sh
./exceptionDirectory2/events2/deploy2.php
./file_to_be_updated.php

Eu criei este script:

#!/bin/bash
TODAY='date --rfc-3339=date'
FILENAME=$TODAY-package.tar
find ./require ! -name db_connection.php         ! -path ./require -mtime -7 -print | xargs tar cvf 'date --rfc-3339=date'-package.tar
find ./img                                       ! -path ./img     -mtime -7 -print | xargs tar uvf 'date --rfc-3339=date'-package.tar
find ./plugin                                    ! -path ./plugin  -mtime -7 -print | xargs tar uvf 'date --rfc-3339=date'-package.tar
find . -maxdepth 1 ! -name $TODAY-package.tar.gz ! -path .         -mtime -7 -print | xargs tar uvf 'date --rfc-3339=date'-package.tar

mas parece que não funciona corretamente, pois sai quase imediatamente com este erro:

tar: ./img: Impossibile open: Is a directory

Observe que "require", "img" e "plugin" são os três diretórios especiais a serem tratados recursivamente. O que há de errado com o roteiro? Obrigado pela sua ajuda.

    
por Seether 14.05.2014 / 13:32

3 respostas

1

O que está causando o erro é que você tem espaços ou outros caracteres especiais nos nomes de arquivos em ./img .

Em vez de usar a opção -print para find , use -print0 e a opção correspondente -0 para 'xargs':

 find ./img ! -path ./img -mtime -7 -print0 | xargs -0 tar uvf 'date --rfc-3339=date'-package.tar
    
por 14.05.2014 / 14:27
0
  • Em vez de find ./foo ! -path ./foo , você pode usar find -mindepth 1 ./foo . Isso garante que apenas os arquivos dentro dos caminhos especificados sejam impressos.
  • Se você tiver o GNU tar , poderá usar --exclude=PATTERN . Dessa forma você deve ser capaz de escrever algo assim:

    today="$(date --rfc-3339="date")"
    last_week="$(date --rfc-3339="date" --date="-7 days")"
    tar --no-recursion --exclude=db_connection.php --after-date="$last_week" cvf "${today}-package.tar" .
    tar --after-date="$last_week" uvf "${today}-package.tar" ./require ./img ./plugin
    
por 14.05.2014 / 13:57
0

Eu escrevo na hora tente se funciona algo em torno de

tar cvf   --no-recursion --after-date $yourdate $TarFile * */* 
tar uvrf  --after-date $yourdate $TarFile ./require ./plugin ./img
    
por 14.05.2014 / 14:11