Script Bash para copia de seguridad tar automática de archivos y directorios elegidos

Script Bash para copia de seguridad tar automática de archivos y directorios elegidos

Dentro de un directorio determinado en el entorno Linux, necesito seleccionar todosarchivosmodificado después de una fecha determinada (digamos 7 días), así como todosdirectorios(solo en el directorio raíz, por lo tanto no recursivo) creado después de la misma fecha.

Después de eso, tengo que ocuparme de 3 directorios que exceptúan la última regla dada. Para estos el proceso tiene que ser recursivo dentro de cada uno de ellos. En uno de estos directorios, hay un archivo que debe excluirse pase lo que pase.

Finalmente, tengo que agregar todos los objetos que coincidan con estos patrones a un único archivo .tar. Por supuesto, cada archivo/directorio debe mantener la ruta relativa completa dentro del archivo .tar (comenzando desde el directorio base).

Entonces supongamos que tenemos:

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

el .tar resultante debe contener:

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

He creado 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

pero no parece funcionar correctamente ya que se cierra casi inmediatamente con este error:

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

Observe que "require", "img" y "plugin" son los tres directorios especiales que se tratarán de forma recursiva. ¿Qué pasa con el guión? Gracias por su asistencia.

Respuesta1

Lo que está causando el error es que tiene espacios u otros caracteres especiales en los nombres de archivo bajo ./img.

En lugar de usar la -printopción to find, use -print0y la -0opción correspondiente a `xargs':

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

Respuesta2

  • En lugar de que find ./foo ! -path ./foopuedas usar find -mindepth 1 ./foo. Esto garantiza que sólo los archivosadentrose imprimen las rutas especificadas.
  • Si tienes GNU tarpuedes usar --exclude=PATTERN. De esa manera deberías poder escribir algo como esto:

    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
    

Respuesta3

Lo escribo sobre la marcha, intento si funciona de alguna manera.

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

información relacionada