![rsync는 파일 필터를 사용하여 특정 폴더를 동기화합니다(패턴별)](https://linux55.com/image/166215/rsync%EB%8A%94%20%ED%8C%8C%EC%9D%BC%20%ED%95%84%ED%84%B0%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8A%B9%EC%A0%95%20%ED%8F%B4%EB%8D%94%EB%A5%BC%20%EB%8F%99%EA%B8%B0%ED%99%94%ED%95%A9%EB%8B%88%EB%8B%A4(%ED%8C%A8%ED%84%B4%EB%B3%84).png)
나는 다음과 같은 구조를 가지고 있습니다 :
/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~