سؤال

Directories:

$ cd /source/xxx/ && find deleteme/
deleteme/
deleteme/file
deleteme/ex me
deleteme/ex me/nono
deleteme/ex me/nono/a
deleteme/ex me/touch

Script:

#!/bin/bash

SOURCE=/source/xxx/deleteme/
TARGET=/media/xxx/
EXCLUDE=("ex me/*")
INCLUDE=("ex me/touch")


for i in "${!EXCLUDE[@]}"
do
  EXCLUDE[i]="--exclude=${EXCLUDE[i]}"
done

for i in "${!INCLUDE[@]}"
do
  INCLUDE[i]="--include=${INCLUDE[i]}"
done

rsync -avR --delete ${INCLUDE[@]} ${EXCLUDE[@]} "${SOURCE}" "${TARGET}"

Result:

$ cd /media/xxx/ && find deleteme/
deleteme/
deleteme/ex me
deleteme/ex me/nono
deleteme/ex me/nono/a
deleteme/ex me/touch
deleteme/file

Expected Result:

$ cd /media/xxx/ && find deleteme/
deleteme/
deleteme/ex me
deleteme/ex me/touch
deleteme/file

Question

How to get expected result?

Without the space "exme" it works.

هل كانت مفيدة؟

المحلول

You're missing quotes on the actual rsync invocation:

rsync -avR --delete "${INCLUDE[@]}" "${EXCLUDE[@]}" "${SOURCE}" "${TARGET}"
#...................^.............^.^.............^

That is crucial to get bash to expand the array into its elements.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top