rsyncはファイルフィルタを使用して特定のフォルダを同期します(パターンごと)

rsyncはファイルフィルタを使用して特定のフォルダを同期します(パターンごと)

私は次の構造を持っています:

/src/2016/aaa1.pdf
/src/2016/aaa2.pdf
/src/2016/aaabbb1.pdf - needed
/src/2016/aaabbb2.pdf - needed
/src/2017/aaa1.pdf
/src/2017/aaa2.pdf
/src/2017/aaabbb1.pdf - needed
/src/2017/aaabbb2.pdf - needed
/src/2018/aaa1.pdf
/src/2018/aaa2.pdf
/src/junk/2016/aaa1.pdf
/src/tmp/aaabbb1.pdf
/src/anotherfolder/aaabbb2.pdf

私が望むのは、すべてのフォルダが同期モードにあることです。bbb.pdfはsrcディレクトリのフォルダパターン201 *から取得されます。 (ゴミを除く、tmpのすべてのディレクトリ...)構造を維持し、以下を取得します。

/dst/2016/aaabbb1.pdf
/dst/2016/aaabbb2.pdf
/dst/2017/aaabbb1.pdf
/dst/2017/aaabbb2.pdf

答え1

単純なシェルglobを使用してこれらのファイルを照合し、--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

答え2

はい、意味は:

cd /src/; for i in 201?; do rsync "${i}"/*bbb?.pdf "/dst/${i}/";done; cd -

答え3

除外ファイルを使用できます。

私のプロジェクトフォルダをリモート配布フォルダと同期させるために、次のスクリプトを作成しました。

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

関連情報