rsync синхронизирует определенные папки (по шаблону) с файловыми фильтрами

В такой оболочке, как bash, вы можете использовать расширенную опцию подстановки, чтобы сначала пометить все каталоги с именами workspaceи chmodза один раз

shopt -s nullglob globstar

Опция nullglobпредназначена для того, чтобы убедиться, что расширение glob не выдает никаких ошибок, когда оно не не находит никаких файлов в пути. Также это гарантирует, что пустая строка glob не будет включена в массив. Опция globstarвключена для рекурсивной подстановки.

Теперь пометьте эти каталоги в массиве оболочки как

dirs=(**/workspace/)

В качестве еще одной проверки работоспособности вы можете сначала распечатать массив, чтобы убедиться, что все требуемые каталоги позаботились. Посмотрите, все ли каталоги перечислены ниже, когда вы выполните приведенную ниже команду printf(),

printf '%s\n' "${dirs[@]}"

Это заполнит массив всеми рекурсивными workspaceпапками, теперь нам нужно использовать chmodдля него

(( "${#dirs[@]}" )) && chmod -R 774 -- "${dirs[@]}"
0
21.01.2020, 13:57
3 ответа

Вы можете сопоставить эти файлы с помощью простого шаблона оболочки и флага--relative(-R)для сохранения путей к файлам в месте назначения:

rsync -avR src/./201?/*bbb*.pdf dst/

Пример запуска с использованием ваших данных

rsync -avR src/./201?/*bbb* dst/
created directory dst
sending incremental file list
2016/
2016/aaabbb1.pdf
2016/aaabbb2.pdf
2017/
2017/aaabbb1.pdf
2017/aaabbb2.pdf

Вы можете проверить, что произойдет, используя rsync --dry-run.

1
28.01.2020, 02:38

Вы имеете в виду как:

cd /src/; for i in 201?; do rsync "${i}"/*bbb?.pdf "/dst/${i}/";done; cd -
0
28.01.2020, 02:38

Вы можете использовать файл исключения.

Я написал этот скрипт для синхронизации папки моего проекта с папкой удаленного развертывания:

#!/bin/bash
shopt -s extglob

# AUTOR: Jonathan López <****@****.**>
# FECHA: Marzo 2019
#
# DESCRIPCIÓN:
#
# Mantiene sincronizada la carpeta de desarrollo de la app web de Pegaso con el dispositivo en el que se despliega.

source $(dirname $0)/myScripts-Functions.sh # Se importan los scripts con las funciones usadas en este archivo

# set -e
# set -x

function display_help()
{
    echo -n "
    $0 [OPTIONS] <port> <ip_device>

    DESCRIPTION:

    Keep the web application development folder syncronized with the device.
    You must have installed rsync in your PC and remote device/server.

    Options:
        -h --help           Show this help.
        -v --version        Show the script version
        <port>              Port of SSH connection.
        <ip_device>       Device's IP where we deploy the web application.
    "
    echo ""
    echo ""
}

function updateFiles()
{
  local port=$1
  local ip=$2
  local sourceFolder=$3
  local destPath=$4
  ## -- 
  local destFolder=root@${ip}:${destPath}
  local excludeFile="--exclude-from ${sourceFolder}exclude-rsync"
  ## ACTIONS:
  rsync -rzh --progress $excludeFile --delete -e "ssh -p $port" $sourceFolder $destFolder 
  ssh -p $port root@${ip} "chown --quiet -R www-data:www-data ${destPath}*"
}

version=0.1

###############################################################################
##     DIFERENCIAS ENTRE LAS VERSIONES DEL SCRIPT
###############################################################################
##  v. 0.1      Primera implementación. Sincroniza la carpeta de desarrollo
##              con la carpeta remota de despliegue. Cambia el propietario y
##              el grupo al que pertenecen los archivos en el destino.
## ----------------------------------------------------------------------------


## --- FIN VARIACIONES ENTRE VERSIONES  --- ##


###############################################################################
## ---                     INICIO DEL SCRIPT                             --- ##
###############################################################################
ip=172.16.3.153     # ip por defecto que se emplea
port=22             # puerto a usar con el protocolo SSH por defecto
projectFolder=$HOME/Proyectos/pegasoWeb/
destPath=/var/www/html/

# Se analizan los parámetros si existen
if [ "$#" -ge 1 ]; then
    if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
      display_help
      exit 0
    elif  [ "$1" == "-v" ] || [ "$1" == "--version" ]; then
      echo "Versión del script ${version}"
      exit 0
    fi

    for (( i=1 ; i<=$# ; i++ ));
    do
        option=${!i}

        if [[ "$option" =~ ^[0-9]+$ ]]; then
          port=$option
        elif valid_ip ${option}; then
          echo "Se ha pasado la ip: $option"
          ip=$option
        fi
    done
fi

# En las siguientes líneas cada vez que se modifica el directorio de origin se
# realiza la sincronización
inotifywait -m --quiet --recursive --event modify,move,create,delete $projectFolder | while read path action file;do
  echo "[$(date '+%Y-%m-%d %R:%S')] Se ha ${action} en ${path} el archivo ${file} y se deberia mover al host: ${ip}:${port}";
  updateFiles $port $ip $projectFolder $destPath
done

В файле exclude-rsyncу меня есть этот контент:

.git/
__*
docs/
*.rar
*.tar.gz
*.po~
*.mo~
layouts/*.js~ 
0
28.01.2020, 02:38

Теги

Похожие вопросы