rsync는 대상 파일을 삭제하지 않습니다 –delete $DIR1/* $DIR2 ls -1 $DIR2 출력은

시간이 지남에 따라 다른 디렉토리로 변경되는 디렉토리를 미러링하려고합니다. 내 문제는 rsync가 소스 디렉토리에 더 이상 존재하지 않으면 대상의 파일을 삭제하지 않는다는 것입니다. 데모 스크립트는 다음과 같습니다.

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

출력은 다음과 같습니다.

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

보시다시피, rsync가 두 번째로 실행 된 후에도 파일 “a”는 대상 디렉토리에 여전히 존재합니다. ‘–delete’옵션을 잘못 사용하고 있습니까?



답변

그 이유는 / tmp / 1 / b에서 rsync를 호출하기 때문에 / tmp / 1 / a 파일을 전혀 고려하지 않기 때문입니다.

당신의 의도는 / tmp / 1 / 디렉토리를 재 동기화하려는 것 같습니다. 개별 파일이 아닌 “/ tmp / 1 /”를 소스로 사용하는 경우 디렉토리에서 “a”가 삭제되어 제거 된 것을 알 수 있습니다 대상에서.


답변

을 제거하십시오 *. rsync 매뉴얼 페이지에서 언급했듯이이 --delete옵션은 와일드 카드 항목에서 작동하지 않습니다.

대신 이것을 사용하십시오 :

rsync -a --delete $DIR1/ $DIR2/

“–delete 이것은 rsync에게 수신 측 (송신 측이 아닌 파일)에서 외부 파일을 삭제하되 동기화되는 디렉토리 만 삭제하도록 지시합니다. rsync에 전체 디렉토리를 보내도록 요청해야합니다 (예 : dir또는 dir/) dir/*와일드 카드가 쉘에 의해 확장되고 rsync가 파일의 상위 디렉토리가 아닌 개별 파일을 전송하도록 요청하기 때문에 디렉토리의 내용에 와일드 카드를 사용하지 않고 (예 🙂 전송 에서 제외 된 파일도 제외됩니다. --delete-excluded옵션 을 사용 하거나 전송 측에서만 일치하는 것으로 규칙을 표시 하지 않으면 삭제됩니다 (필터 규칙 섹션의 포함 / 제외 수정 자 참조).


답변

두 번째 rsync 행을 rsync -a --delete $DIR1/ $DIR2(* 제외)로 변경하면 작동합니다. 그 이유는 쉘 *이 첫 번째 디렉토리의 파일 이름으로 파일 이름을 확장하기 때문입니다 . 귀하의 경우 b이므로 누락 된 파일 a는 rsync에 의해 전혀 고려되지 않습니다 rsync -a --delete $DIR1/b $DIR2. 실행되는 명령은 실제로 입니다.