내 목표는 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 옵션에는 항상 짧은 문자가 포함되어야 합니다. 또는 규칙 시작 부분에 있는 긴 규칙 이름입니다.