캐시 디렉토리를 제외하지 않는 이 쉘 스크립트의 최소한의 작업 예제가 있습니다.
#!/bin/sh
SRC_DIR="/home/"
DEST_DIR="/backup/test"
OPTSTR="-avzHAXx --delete --exclude '.cache'"
rsync $OPTSTR $SRC_DIR $DEST_DIR
하지만 열어서 작성하면 작동할 수 있습니다.
#!/bin/sh
rsync -avzHAXx --delete --exclude '.cache' /home/ /backup/test
문제는 무엇입니까?
답변1
귀하의 문제는 문자열을 사용하는 방식과 관련이 있습니다 $OPTSTR
. 이것은 공백으로 구분된 여러 단어로 구성된 문자열이며, 따옴표 없이 사용하기 때문에 쉘은 이를 별도의 단어 목록으로 분할합니다. 그러나 쉘은 추가 따옴표 제거 단계를 수행하지 않으므로 문자열의 작은 따옴표는단어. 따라서 명령은 이름이 '.cache'
. .cache
공백이나 와일드카드 패턴이 포함된 문자열을 사용해야 하는 경우에도 문제가 있습니다.
간단히 말해서, 분리해야 하는 문자열에 별도의 항목을 넣지 마세요.
대신 목록을 사용하세요.
#!/bin/sh
src_dir=/home
dest_dir=/backup/test
set -- -v -a -x -HAX --delete --exclude='.cache/'
rsync "$@" "$src_dir/" "$dest_dir"
그러면 위치 인수 목록이 나중에 사용하려는 옵션으로 설정됩니다 rsync
. 각 인수는 확장이 $@
큰 따옴표로 묶인 한 공백과 와일드카드가 포함된 따옴표 붙은 문자열을 포함하더라도 올바르게 처리됩니다 .
또는 bash
다음을 사용하는 경우 명명된 배열을 사용할 수 있습니다.
#!/bin/bash
src_dir=/home
dest_dir=/backup/test
opts=( -v -a -x -HAX --delete --exclude='.cache/' )
rsync "${opts[@]}" "$src_dir/" "$dest_dir"
또한 관련: