변수를 사용하여 스크립트에서 rsync의 "--exclude={..}" 옵션 대상을 지정할 수 없습니다.

변수를 사용하여 스크립트에서 rsync의 "--exclude={..}" 옵션 대상을 지정할 수 없습니다.

내 목표는 bash 스크립트가 다음 명령을 실행하도록 하는 것입니다.

rsync -azhi --dry-run --exclude={'file1.txt','file2.txt','*.sql'} /from-directory/ /to-directory/

...이렇게 추상화하면:

srcdir='/from-directory/'
dstdir='/to-directory/'
excludes="{'file1.txt','file2.txt','*.sql'}"
rsync -azhi --dry-run --exclude="$excludes" "$srcdir" "$dstdir"

$srcdir$dstdir올바르게 평가했지만 내가 $excludes원했던 것만큼 설명되지 않았습니다. 명령줄에서는 --exclude={'file1.txt','file2.txt','*.sql'}이 잘 작동합니다. 그러나 {...} 문자열을 변수에 채우려고 하면 작동이 중지됩니다.

답변1

배열을 사용해 보세요. 예를 들어:

excludes=(file1.txt file2.txt '*.sql')
rsync -azhi --dry-run $(printf -- "--exclude=%q " "${excludes[@]}") /from-directory/ /to-directory/

그런데 이렇게 할 경우 *.sql작은따옴표로 묶지 마세요.생각하다현재 디렉터리의 모든 .sql 파일로 확장됩니다. 원하시는 내용은 아닌 것 같아 인용해봤습니다.

이는 다음으로 확장됩니다.

rsync -azhi --dry-run --exclude=file1.txt --exclude=file2.txt --exclude=*.sql /from-directory/ /to-directory/

또는:

rsync -azhi --dry-run --exclude="$(printf -- "%q," "${excludes[@]}" |
    sed -e s/,$//)" /from-directory/ /to-directory/

다음으로 확장 예정:

rsync -azhi --dry-run --exclude=file1.txt,file2.txt,*.sql /from-directory/ /to-directory/

답변2

그리고 rc파생물 또는 zsh -o rcexpandparam:

excludes=(file1.txt file2.txt '*.sql')
rsync -azhi --dry-run '--exclude=- '$excludes $srcdir $dstdir

그리고 fish:

set excludes file1.txt file2.txt '*.sql'
rsync -azhi --dry-run '--exclude=- '$excludes $srcdir $dstdir

그리고 zsh:

excludes=(file1.txt file2.txt '*.sql')
rsync -azhi --dry-run '--exclude=- '$^excludes $srcdir $dstdir

( 이 배열 확장에 대해 -style 확장이 ^활성화된 경우 rc)

그리고 ksh93/ bash/ zsh:

excludes=(file1.txt file2.txt '*.sql')
rsync -azhi --dry-run "${excludes[@]/#/--exclude=- }" "$srcdir" "$dstdir"

대신 을 사용한다는 점에 유의하십시오 . 그렇지 않으면 , '--exclude=- '또는 와 같은 일부 패턴이 있으면 --exclude=작동하지 않습니다 . 매뉴얼 페이지를 참조하십시오(강조):$excludes- *+ *!rsync

       --제외=패턴
              이 옵션은 --filter 옵션의 축약형입니다.
              제외 규칙의 기본값은 다음과 같습니다.  완전히 허용되지 않음
              일반 필터링 규칙에 대한 규칙 구문 분석 구문.

[...]

       --include/--exclude 명령줄 옵션은 허용되지 않습니다.
       위와 같이 포괄적인 규칙을 구문 분석합니다.  허용하다
       포함/제외 패턴 지정 및 삭제할 토큰 "!"
       목록(및 파일에서 규칙을 읽을 때 일반적인 주석 구문 분석).
       패턴이 "-"(대시, 공백) 또는 "+"(더하기 기호,
       공백) 규칙은 "+"로 해석됩니다(다음을 포함하는 규칙의 경우).
       옵션) 또는 "-"(제외 옵션의 경우)를 문자열 접두사로 사용. ㅏ
       반면 --filter 옵션에는 항상 짧은 문자가 포함되어야 합니다.
       또는 규칙 시작 부분에 있는 긴 규칙 이름입니다.

관련 정보