вторник, 28 февраля 2017 г.

Backup файлов с сохранением заданной структуры папок и фильтрацией по расширениям файлов

Возникла необходимость периодически сохранять файлы работ отдела на некоторый удаленный сервер в случае непредвиденных обстоятельств. Задача простая и не простая одновременно. И так - техническое задание:
1. Копировать только файлы заданных расширений, для уменьшения объема занятого места.
2. Сохранить из общего пути местонахождения файлов только конечные папки, если возникнет необходимость сжать выборочно.
3. Копирование ведется накопительно, старые файлы не удаляются, новые добавляются, если изменились имеющееся - перезаписываются.
4. Используется системные утилиты, на случай повторения такого сценария где либо еще.
5. Место положения и место хранения может быть разным и хозяева данных тоже.
И так, система - Debian Jessie, язык сценария - bash, управление периодичностью служба cron.
Небольшое отступление, в момент написания скрипта были использованы всевозможные варианты фильтрации расширений с использованием grep.

indir=$PWD/in;
outdir=$PWD/out;
tru_ex=( "jpg"
         "tif"
         "odt" );
find -type 'f' |grep -E "$(echo -e ${tru_ex[@]}|sed 's/\ /|/g')"

или

indir=$PWD/in;
outdir=$PWD/out;
tru_ex=( "jpg"
         "tif"
         "odt" );
find -type 'f' |grep -E "$(echo -e ${tru_ex[@]}|sed 's/\ /|/g')"|xargs -I % cp -r -f  --parent "%" -t  $outdir;
- тут проблема с утилитой xargs, не "переносит" одинарные кавычки...

был и вариант из серии использования массива параметров утилиты find:

indir=$PWD/in;
outdir=$PWD/out;
tru_ex=( "jpg"
         "tif"
         "odt" );
fexec=();
for ((i_exc=0; i_exc != ${#tru_ex[@]}; i_exc++))
       do
        if [ $i_exc != $((${#tru_ex[@]}-1)) ] 
            then  parm=" -o -name";
            else parm="";
        fi
        fexec[${#fexec[@]}]=" *.${tru_ex[$i_exc]} $parm";
done
extract=$(echo "find -type f" "(" "-name " "$(echo -e ${fexec[@]})" ")")$(echo " -exec cp -f -r --parent --target-directory=$outdir {} ;");
#"
cd $indir

$extract

- который при большом количестве указанных расширений - 
просто "ложит" систему....!

тот скрипт который получился в конечном итоге, выполняет все требования и не перегружает систему при копировании. Код ниже и ссылка для скачивания.

#!/bin/bash
##  author (c) by koshuba v.o. - open technologies
## The script is copying files from the given extensions .. (weak version of the processor)
#date
rdate=`date +%d.%m.%y_%H:%M`
#logfile
log=/var/log/syslog

#the master directory on the server
smbuser=( user1 user2 user3 user4 );
smbgroup=( group1 group2 group3 group4 )
## allowed extensions
tru_file=( "bmp"
    "doc"
    "docx"
    "jpg"
    "mdb"
    "odb"
    "odt"
    "pdf"
    "PST"
    "QST"
    "shx"
    "tif"
    "ttf"
    "txt"
    "xls"
    "xlsx"
    "xml"
    "rtf"
    "ods" );
# synchronize directories
get_dir=( "/work/share"
  "/work/share"
  "/share2"
  "/share2" );
# directly copied directories
read_dir=( "work1"
  "work2"
  "work3"
  "work4" );
# directories to backup files
put_dir=( "/arhive/copy_share"
  "/arhive/copy_share"
  "/arhive/copy_share"
  "/arhive/copy_share" );
#------------------------------------------------
echo `date +%d.%m.%y_%H:%M` "Begin syncing files on the server...">>$log
# Copy the specified directory on the server and update Regulations
# We will perform the cycle until the end of the array of names
for ((i_names=0; i_names != ${#get_dir[@]}; i_names++))
    do
    cd ${get_dir[$i_names]};
# We will perform the cycle until the end of the array of allowed extensions
    for ((i_ex=0; i_ex != ${#tru_file[@]}; i_ex++))
 do
 find ${read_dir[$i_names]} -type 'f' -name "*.${tru_file[$i_ex]}" -exec cp -r -f --parent -t ${put_dir[$i_names]} '{}' \;
    done
# Assign user permissions
chmod -R 0666 ${put_dir[$i_names]}/${read_dir[$i_names]};
chmod -R ugo+X ${put_dir[$i_names]}/${read_dir[$i_names]};
chown -R ${smbuser[$i_names]}:${smbgroup[$i_names]} ${put_dir[$i_names]}/${read_dir[$i_names]};
done

echo `date +%d.%m.%y_%H:%M` "Leaving syncing files on the server...">>$log
exit 0


Скачать можно тут...
...и да прибудет с вами великий backup! 😄