rsync는 삭제될 파일을 보고하지 않습니다.

rsync는 삭제될 파일을 보고하지 않습니다.

나는 본 적이이것(그리고 포럼 주제여기) 그리고이것.

저는 명령줄에서 실행하는 것뿐만 아니라 Python에서도 실행해 보았습니다. 다시 확인했습니다. 일부 파일은 실제로 소스에서는 제거되었지만 link-dest대상에는 존재합니다. 나는 몇 가지 옵션을 시도했습니다. 경로 끝에 슬래시를 추가하여 차이가 있는지 확인하려고 했습니다. 모든 경우의 경로는 단순한 디렉터리이며 전역 패턴으로 끝나지 않습니다. 맨페이지도 확인해봤습니다.

그런데, 이것은 중요하지 않지만 여러분은 알 수 없습니다. 저는 이것을 WSL(W10 OS)에서 실행하고 있습니다.

아무것도 작동하지 않는 것 같습니다.

그런데 소스에서 삭제된 파일은하다테스트 실행이 아닌 경우 대상 위치에서 삭제되거나 복사되지 않습니다.

내가 하고 싶은 것은 link-dest변경된 사항이 없으면 작업을 취소할 목적으로 위치와 소스 사이에 변경된 사항을 알아내는 것입니다. 하지만 이렇게 하려면 새 파일이나 수정된 ​​파일은 물론 삭제된 파일의 목록도 얻을 수 있어야 합니다.

내가 시도한 Python 코드는 다음과 같습니다.

link_dest_setting = '' if most_recent_snapshot_of_any_type == None \
    else f'--link-dest={most_recent_snapshot_of_any_type[0]}'
rsync_command_args = [ 'rsync', 
                       '-v', 
                       # '--progress',
                       # '--update', 
                       '--recursive', 
                       '--times', 
                       '--delete', 
                       # '--info=DEL', 
                       '-n', 
    link_dest_setting, source_dir, new_snapshot_path, ]
print( f'running this: {rsync_command_args}')    
result = subprocess.run( rsync_command_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
rsync_result_stdout = result.stdout.decode( 'utf-8' )
print( f'rsync_result stdout |{rsync_result_stdout}|')
rsync_result_stderr = result.stderr.decode( 'utf-8' )
print( f'rsync_result stderr |{rsync_result_stderr}|')

일반 stdout(시험 실행):

rsync_result stdout |sending incremental file list
./
MyModifiedFile.odt

sent 1,872 bytes  received 25 bytes  3,794.00 bytes/sec
total size is 6,311,822  speedup is 3,327.27 (DRY RUN)

|

(보고된 오류 없음 stderr)

방금 또 다른 옵션을 찾았습니다. -i이 옵션을 사용하면 정말 신비로워집니다.

rsync_result stdout |sending incremental file list
.d..t...... ./
>f.st...... MyModifiedFile.odt

sent 53,311 bytes  received 133 bytes  35,629.33 bytes/sec
total size is 6,311,822  speedup is 118.10
|

편집하다

일반적인 BASH 명령:

rsync -virtn --delete --link-dest=/mnt/f/link_dest_dir /mnt/d/source_dir /mnt/f/destination_dir

원칙적으로 테스트 실행에서는 link_dest_dir 아래에 존재하는 파일/디렉터리를 표시해야 하지만, source_dir 아래에는 존재하지 않는(삭제된) 파일/디렉터리를 표시해야 합니다. 이것을 표시할 수 없습니다. 어쨌든, Python 답변이 더 나은 솔루션일 수 있다고 생각합니다. 차이점을 처음 감지하면 스캔이 중지되기 때문입니다.

편집 2

(roaima의 질문 "무엇을 저장하고 있습니까?"에 대한 답변)
내 "내 문서" 디렉토리는 약 6GB이며 수천 개의 파일이 있습니다. 차이점이 발견되지 않으면 내 Python 스크립트를 스캔하는 데 약 15초가 걸립니다(차이가 있는 경우에는 더 짧음). rsync복사를 완료하는 데 일반적으로 약 2분이 소요됩니다(대부분의 파일에 대해 하드 링크 사용). 소스와 위치 사이에 변경 사항이 없기 때문에 이것이 불필요한 것으로 판명되면 link-dest해당 파일과 하드 링크를 모두 삭제해야 합니다. 삭제 작업 자체는 시간 측면에서 매우 비쌉니다. 참고로 이건 외장형 HD 회전보드 타입입니다. 가장 느린 저장 위치는 아니지만 한계가 있습니다.

또한 중요한 점은 rsync소스에서 삭제된 파일을 보고할 방법이 없는 것 같기 때문에 적어도 내가 찾은 것에서는 이 새 스냅샷이 스냅샷과 동일하다는 것을 어떻게 알 수 있습니까 link-dest? 이러한 스냅샷 위치에서는 제한된 수(예: 5개)의 스냅샷만 유지하고 싶지만 이전 스냅샷과 다른 경우에만 새 스냅샷을 추가하고 싶습니다. 따라서 스크립트가 10분마다 실행되더라도 인접한 스냅샷 간의 간격은 40분 이상이 될 수 있습니다.

당신(roaima)은 평판이 좋고 에 속해 있는 것 같습니다 . 제가 대답하고 싶은 간단한 질문은: 테스트 실행 시 삭제와 관련된 소스의 파일/디렉터리를 보고 rsync할 수 있습니까 ? 그렇지 않다면 이것은 버그/결함입니까? 매뉴얼 페이지에서는 이런 일이 발생해야 한다고 주장하는 것 같습니다(예: ).rsynclink-dest--info=DEL

답변1

귀하의 질문의 핵심 부분은 다음과 같습니다.

이전 스냅샷과 다른 경우에만 새 스냅샷을 추가하고 싶습니다. 따라서 스크립트는 10분마다 실행될 수 있지만 인접한 스냅샷 간의 간격은 40분 이상이 될 수 있습니다.

그리고

rsync가 연습 실행 시 링크 대상과 관련하여 소스에서 삭제된 파일이나 디렉터리를 보고할 수 있습니까?

여기서 제가 이해한 바는 귀하가 버전을 구현했으며 rsnapshot백업을 고려할 때마다더 일찍백업 디렉터리가 사용자 --link-dest디렉터리가 됩니다. 가장 큰 차이점은 현재 소스 트리와 최신 백업 사이에 변경 사항이 없으면 해당 경우에는 백업이 필요하지 않다는 것입니다.

내 간단한 실험에서는 단순히 출력을 보는 것이 가능해 보였습니다 rsync. 출력이 있으면 작업을 수행해야 하고, 그렇지 않으면 작업이 없습니다. 핵심은 링크된 디렉터리를 직접 보는 것입니다.

output=$(rsync -rti --delete --dry-run "$src/" "$lnk/" 2>&1 | grep -v '^[^*]d' | head -n1)
if [ -n "$output" ]
then
    # Work to be done
    rsync -rtiv --link-dest "$lnk/" "$src/" "$dst"
fi

현재 테스트에서 디렉터리를 생략하고 있으므로 디렉터리를 변경해도 백업이 실행되지 않습니다. 디렉터리 변경에도 관심이 있다면 grep테스트에서 필터를 제거하세요.

답변2

이는 Python을 사용하므로 해결 방법입니다. 나는 하루의 대부분을 diff두 가지 방법을 모두 시도하면서 보냈습니다. 소스에서 제거되어 해당 위치(예: 테스트 실행) 에 존재하는 파일/디렉터리를 보고 rsync할 수 없습니다 . 작업을 수행하는 것처럼 보이지만 큰 디렉토리의 경우 매우 장황할 수 있으며 "차이가 발견되면 중지"라고 말할 수 없습니다. 이 문제에도 동일하게 적용됩니다 .rsynclink-destdiffrsync

import filecmp

def same_folders(dcmp):
    if dcmp.diff_files or dcmp.left_only or dcmp.right_only:
        return False
    for sub_dcmp in dcmp.subdirs.values():
        if not same_folders(sub_dcmp):
            return False
    return True

if same_folders(filecmp.dircmp( source_dir, link_dest_dir_path )):
    print( 'NO CHANGE' )
    # ... act accordingly

첫 번째 실험에서는 이것이 두 디렉토리 간의 차이점을 찾는 빠른 방법임을 보여주는 것 같습니다. 그런데, 생성하는 데 사용할 diff 함수 dircmp.diff_files(경로는 동일하지만 다른 파일 목록) 를 조사하지 않았습니다 .

left_only소스에서 새 파일/디렉터리를 찾 거나 right_only소스에서 제거된 파일/디렉터리를 각각 찾습니다.

차이점이 발견되는 순간 분명히 중단될 것입니다.

나 배쉬 알아요많은Python보다 적습니다... 위와 동일한 BASH가 가능한지 궁금합니다. 그럼 속도 비교를 해보는 것도 재미있을 것 같습니다.

관련 정보