2013-05-28 2 views
4

특정 디렉토리 및 파일 유형 (--exclude)을 제외하고 내 집 및 기타 중요한 디렉토리를 외장 드라이브에 백업하기위한 스크립트를 만들려고합니다. exclude 목록 (--delete-excluded)에 파일 형식이나 디렉토리를 추가 할 경우를 대비하여 백업에서 제외 된 파일도 삭제해야합니다.rsync에서 디렉토리가 제거되지 않도록하려면 어떻게해야합니까?

또한 무언가가 끔찍하게 잘못 될 경우를 대비하여 제거 된 모든 항목을 백업해야합니다 (--backup --backup-dir=rsync/backup).

나는이 함께 시작입니다 : --backup --backup-dir=rsync/backup

#!/usr/bin/env bash 

PATH_PWD="`pwd`" 
PATH_HOME=~ 
SRC="/home/redsandro" 
PATH_TARGET="/media/redsandro/MyBook 4TB/backup/`hostname`" 
PATH_BIN="${SRC}/bin" 
EXCL_FROM="${PATH_BIN}/rs-backup-external.sh.exclude.txt" 
DATE="`date +%Y-%m-%d`" 

OPTS="-ahl --update --del --delete-excluded --force --ignore-errors --progress --stats --exclude-from=$EXCL_FROM --log-file=~/rsync/rsync.$DATE.log" 
OPTS="$OPTS --backup --backup-dir=rsync/backup/${DATE}" 
#OPTS="$OPTS --dry-run" 

echo Backing up $SRC to $PATH_TARGET... 
echo 
sudo rsync $OPTS "$SRC/" "${PATH_TARGET}${SRC}" 

이제 분명히 --del 충돌합니다. 이 디렉터리가 삭제되지 않도록 제외 할 수 있습니까? 아니면 이것을하기위한 더 쉬운 방법이 있을까요?

내 목표는 모든 컴퓨터에서 실행할 수있는 스크립트를 갖는 것입니다.이 컴퓨터에서 부품은 컴퓨터 별 디렉토리에 동기화되고 다른 부품 (문서, 그림)은 모두 글로벌 디렉토리에 동기화됩니다 어쨌든.

+0

혹시이 문제를 해결 했 :

은 여기 내 man (1) rsync의 말씀입니까? 나는 당신이 무엇을하려고하는지 명확하지 않다 - 백업의 백업? – philshem

+0

아니, 내가 한 적이 없어. 정기적 인 미러 백업을 시도했지만 백업에서 삭제할 모든 파일을 특수 디렉토리로 이동하여 우연히 제거 된 항목을 실행 취소 할 수있었습니다. – Redsandro

+0

아마도 rsync의 -n 또는 --dry-run 옵션을 사용하여 수행 할 작업을 확인한 다음 rsync의 실제 실행에서 삭제 될 데이터를 복사 할 수 있습니까? – GL2014

답변

2

Rsync는 멋진 도구이지만 때로는 사용하기가 어렵습니다.

문제는 --exclude-from입니다.이 규칙은 보내는 쪽과받는 쪽 모두에 전역 제외 규칙을 설정합니다.

rsync는 파일 시스템에서 작업을 수행하기 전에 먼저 송신 측 (클라이언트)과 수신 측 (서버)의 두 파일 목록을 어셈블합니다. 파일이 양면에서 제외되면 rsync는이를 무시합니다. 송신 측에서만 제외되어 수신 측에 존재하면 rsync가 수신 측에서 삭제합니다.

귀하의 경우 규칙에서 양측의 파일을 제외하고 있으므로 rsync에서 해당 파일을 삭제하지 않습니다. 그런 다음 --delete-excluded을 사용하여 강제로 삭제하십시오. 하지만 말씀 드린 것처럼이 옵션은 --backup --backup-dir=rsync/backup과 충돌합니다.

다음을 수행하는 것이 좋습니다.

  1. 일반 필터 파일로 변환 $EXCL_FROM, 즉, 그들이 규칙을 배제하기 위해 각 행 앞에 마이너스 기호를 삽입합니다.
  2. rsync 옵션에서 --exclude-from=$EXCL_FROM--delete-excluded을 제거하십시오.
  3. rsync 옵션에 -FF을 포함하십시오.
  4. rsync 호출 전에 다음 명령을 포함하십시오.

    cp "$EXCL_FROM" "$SRC/.rsync-filter" 
    
  5. 이런 식으로

, 당신의 규칙은 송신 측에 적용되며, 발견하는 경우 제외 규칙으로 지정된 파일은 수신 측에서 제거됩니다. 백업 옵션과 충돌해서는 안됩니다. 이전의 양쪽에 .rysnc-filter 이름

업데이트

본질적으로, -FF 옵션을 만드는 rsync를 공정 디렉토리 별 필터 파일. 귀하의 경우에는 송신 측에만 존재하므로 규칙이 수신 측에 적용되지 않습니다.

실제로는 -FF-F -F과 같습니다. 첫 번째 F은 rsync에게 전에 말한 것처럼 소스와 대상 디렉토리의 루트에있는 .rsync-filter의 규칙을 병합하도록 알려줍니다. 두 번째 F은 rsync에이를 제외하도록 지시합니다. .rsync-filter을 전송하지 않으려면 제외 규칙이 수신 측에도 적용되고 원래의 문제가 반환됩니다. 제외 된 파일은 삭제되지 않습니다.

-F same as --filter='dir-merge /.rsync-filter' 
     repeated: --filter='- .rsync-filter' 
+0

'man' 파일에'-FF'가 언급되어 있지 않습니다. 무슨 의미입니까? – Redsandro

+0

나는'-FF'에 대한 설명으로 답변을 업데이트했다. 그것이 명확하지 않은지 물어보십시오. – Rafa

+0

감사합니다. 목록 형식 요약 (보류중인 동료 검토)을 추가하고 답변을 수락했습니다. – Redsandro

관련 문제