Bash-скрипт для автоматического резервного копирования tar выбранных файлов и каталогов

Bash-скрипт для автоматического резервного копирования tar выбранных файлов и каталогов

В заданном каталоге в среде Linux мне нужно выбрать всефайлыизмененные после определенной даты (скажем, 7 дней), а также всекаталоги(только в корневом каталоге, следовательно, нерекурсивно) создано после той же даты.

После этого мне нужно позаботиться о 3 каталогах, которые исключают последнее данное правило. Для них процесс должен быть рекурсивным внутри каждого из них. В одном из этих каталогов есть файл, который нужно исключить в любом случае.

Наконец, мне нужно добавить все объекты, соответствующие этим шаблонам, в один архив .tar. Каждый файл/каталог, конечно, должен содержать полный относительный путь в файле .tar (начиная с базового каталога).

Итак, предположим, что у нас есть:

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

Полученный .tar должен содержать:

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

Я создал этот скрипт:

#!/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

но, похоже, он работает неправильно, поскольку почти сразу завершает работу с этой ошибкой:

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

Обратите внимание, что "require", "img" и "plugin" — это три специальных каталога, которые следует обрабатывать рекурсивно. Что не так со скриптом? Спасибо за помощь.

решение1

Причиной ошибки является наличие пробелов или других специальных символов в именах файлов в разделе ./img.

Вместо использования -printпараметра to findиспользуйте -print0и соответствующий -0параметр `xargs':

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

решение2

  • Вместо того, чтобы find ./foo ! -path ./fooвы могли использовать find -mindepth 1 ./foo. Это гарантирует, что только файлывнутриуказанные пути будут напечатаны.
  • Если у вас есть GNU, tarвы можете использовать --exclude=PATTERN. Таким образом, вы сможете написать что-то вроде этого:

    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
    

решение3

Я пишу это на ходу, пробую, работает ли что-то вокруг

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

Связанный контент