가변 rsync 필터 매개변수

가변 rsync 필터 매개변수

가변 rsync 매개변수에 대해 질문이 있습니다. COMPILE_FILTERS 변수에 필터 표현식을 연결하고 있습니다. 예:

COMPILE_FILTERS='--filter="- js/editor/editorjs/*"'
rsync -a $COMPILE_FILTERS \
  --filter="- *node_modules*" \
  --filter="- .git*" \
  --filter="- /**/.git*" \
  $src $dest

다음 응답이 표시됩니다.

Unknown filter rule: `"-'
rsync error: syntax or usage error (code 1) at exclude.c(927) 
[client=3.1.3]

통역사가 하이픈을 차단하는 것 같기 때문에 이것은 이상합니다.

제안사항이 있으면 미리 감사 인사를 전해주세요.

답변1

코드에 두 가지 문제가 있습니다.

  1. 확장은 $COMPILE_FILTERS인용되지 않았습니다. 이는 해당 값이 --filter="- js/editor/editorjs/*"공백의 단어로 분할됨을 의미합니다(기본적으로). 이 단어는 --filter="-및 입니다 js/editor/editorjs/*". 이 단어는 파일 이름 생성(와일드카드)을 수행하지만 귀하의 경우 해당 패턴과 일치하는 파일이 있는 경우에만 문제가 됩니다 js/editor/editorjs/*".

    두 단어로 나누면 rsync다음을 얻을 수 있습니다.두 가지 인수, 그 중 첫 번째 항목을 올바르게 사용하지 못합니다(오류 메시지에서 참조하는 내용).

    당신이 해결이것큰따옴표를 통해 인용된 변수를 확장하면 문제가 해결됩니다.

  2. 변수에 저장한 문자열포함하다큰따옴표. 변수 확장을 큰따옴표로 묶는 경우 기본적으로 rsync필터 "- js/editor/editorjs/*"(큰따옴표 및 모든 항목 포함)를 사용하라는 의미입니다. 이는 문자열 주위에 작은따옴표를 사용하고 있기 때문입니다.

    당신이 해결이것변수에 올바른 문자열을 할당하여 문제를 해결하십시오.

    COMPILE_FILTERS=--filter="- js/editor/editorjs/*"
    

    또는

    COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
    

최종 결과:

COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
rsync -a "$COMPILE_FILTERS" \
  --filter="- *node_modules*" \
  --filter="- .git*" \
  --filter="- /**/.git*" \
  "$src" "$dest"

코드와 관련된 다른 변수도 참조하고 있습니다.

또한보십시오:


나중에 변수에 더 많은 필터를 포함하기로 결정한 경우 배열로 전환해야 합니다(이러한 필터를 지원하는 셸에서).

filters=(
    --filter="- js/editor/editorjs/*"
    --filter="- *node_modules*"
    --filter="- .git*"
    --filter="- /**/.git*"
)

rsync --archive "${filters[@]}" "$src" "$dest"

명명된 배열 변수( /bin/sh, dash)가 없는 셸에서는 less를 입력할 수 있습니다.

set -- \
    --filter="- js/editor/editorjs/*" \
    --filter="- *node_modules*" \
    --filter="- .git*" \
    --filter="- /**/.git*"

rsync --archive "$@" "$src" "$dest"

개별 필터 매개변수를 적절하게 처리하려면 배열이나 목록이 필요합니다. 여러 필터를 단일 문자열로 결합하는 것은 가능하지만 셸의 토큰화 및 파일 이름 글로빙을 적절하게 처리해야 하기 때문에 훨씬 더 어렵습니다.

관련 정보