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

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

Dentro de um determinado diretório no ambiente Linux, preciso escolher todosarquivosmodificado após uma determinada data (digamos 7 dias), bem como todosdiretórios(somente no diretório raiz, portanto não recursivamente) criado após a mesma data.

Depois disso, tenho que cuidar de 3 diretórios que exceto a última regra dada. Para estes, o processo deve ser recursivo dentro de cada um deles. Em um desses diretórios, há um arquivo que deve ser excluído de qualquer maneira.

Finalmente, tenho que adicionar todos os objetos que correspondem a esses padrões em um único arquivo .tar. É claro que cada arquivo/diretório deve manter o caminho relativo completo dentro do arquivo .tar (começando no 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 .tar resultante 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 não funcionar corretamente, pois é encerrado 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.

Responder1

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

Em vez de usar a -printopção para find, use -print0a -0opção correspondente para `xargs':

 find ./img ! -path ./img -mtime -7 -print0 | xargs -0 tar uvf `date --rfc-3339=date`-package.tar

Responder2

  • Em vez de find ./foo ! -path ./foovocê poder usar find -mindepth 1 ./foo. Isso garante que apenas os arquivosdentroos caminhos especificados são impressos.
  • Se você possui GNU, tarpode usar --exclude=PATTERN. Dessa forma, você poderá 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
    

Responder3

Eu escrevo na hora, tento se funciona alguma coisa

tar cvf   --no-recursion --after-date $yourdate $TarFile * */* 
tar uvrf  --after-date $yourdate $TarFile ./require ./plugin ./img

informação relacionada