rsync: 특정 사용자에게 속하지 않은 파일 삭제 방지

rsync: 특정 사용자에게 속하지 않은 파일 삭제 방지

나는 rsync를 사용하여 대용량 공유 문서 폴더를 내 노트북과 동기화 상태로 유지하고 있습니다. 더 구체적으로 말하자면, 내 노트북에서 공유 저장소로 재동기화하고 있습니다. 내가 하고 싶은 것은 내 사용자가 생성/수정한 파일만 재동기화하는 것입니다. 공유 저장소이기 때문에 다른 사람들이 다른 디렉터리나 파일을 만들었을 수도 있습니다.

다양한 rsync 옵션을 찾아봤지만 원하는 것을 찾지 못했습니다. 다른 메타데이터는 제공 할 수 없고 파일 이름과 일치하는 패턴만 제공할 수 있습니다 --exclude( 또는 제공할 수 있습니까?).--delete-excluded

대안이지만 다소 번거로운 해결책은 find -not -perm $USER > excluded_files이를 제외하고 rsync와 같은 원격 스크립트를 시작할 수 있지만 저는 그렇게 하지 않는 것이 좋습니다.

어떤 아이디어가 있나요?

업데이트: 명확히 하자면, 내 노트북에 있는 데이터는 서버에 있는 데이터의 일부일 뿐입니다. 여기에 예가 있습니다.

  • 내 노트북 dir_1에는dir_2
  • 나는 그것들을 서버에 재동기화합니다. 이제 서버에는 두 개의 디렉토리가 있습니다
  • 다른 사용자가 서버에 로그온하여 새 디렉터리를 만듭니다.dir_3
  • 내 파일을 엉망으로 만들었습니다. 이제 다시 rsync를 수행하지만 --delete를 사용해야 합니다.
  • 처음에 생성한 파일, 즉 dir_1및 에 있는 파일만 --삭제하고 싶습니다 dir_2.~ 아니다 dir_3

답변1

나는 랩톱에 있는 모든 파일의 복사본을 보관하는 것이 선택 사항이 아니라고 가정합니다. 그렇지 않으면 훨씬 쉬울 것입니다.

여기서 올바른 도구는 버전 제어 도구입니다. 그러나 모든 사용자가 최소한의 기술적 정교함을 갖추지 않은 이상 버전 제어 도구를 사용하도록 하는 것은 현실적인 제안이 아니라는 것을 알고 있습니다. 그리고 그때에도 노트북에서 확인하는 내용을 신중하게 선택해야 합니다.

여전히 버전 제어를 사용할 수 있습니다. 공유 컴퓨터에서 모든 파일을 체크인하고 다른 사람의 파일은 그대로 두십시오. 노트북에 별도의 결제를 유지하세요. 머신을 전환할 때마다 커밋하고 체크아웃하세요. 그것에 대해 더 많이 생각할수록 이 옵션이 더 마음에 듭니다. 코딩이나 깨지기 쉬운 스크립팅이 필요하지 않습니다.


양방향 동기화를 수행합니다. Rsync는 이 기능을 잘 수행하지 못합니다. 실행하는 것을 잊어버렸거나 실수로 잘못된 방향으로 실행한 경우 경고 없이 작업을 잃을 가능성이 높습니다.조화양방향 동기화를 위한 좋은 도구입니다. 항상 양방향으로 동기화하고 파일이 양쪽에서 변경되면 불평합니다. 오픈 소스이며 Unix 및 Windows 플랫폼 모두에 잘 통합되어 있습니다.

불행하게도 unison에는 rsync와 마찬가지로 소유자별로 파일을 무시하는 옵션이 없습니다. 를 사용하여 무시 목록을 생성할 수 있지만 지저분해지며, 또는 실행 find -user사이에 다른 사람이 파일을 추가하거나 삭제하면 경쟁 조건이 발생 합니다 .findunisonrsync

rsync 또는 unison을 패치하여 메타데이터를 기반으로 파일을 무시하는 옵션을 추가할 수 있습니다. 방금 소스를 잠깐 살펴보았는데 두 경우 모두 제외 코드는 디렉토리 항목이 아닌 문자열에 강력하게 연결되어 있습니다. 실행 가능해 보이지만 사소한 패치는 아닙니다.


자신의 파일만 포함하는 파일 시스템 보기를 만들 수 있습니다. 완전하고 원활한 솔루션은 없지만 시작하기 위한 몇 가지 아이디어는 다음과 같습니다.

  • 공유 시스템이 하드 링크를 지원하는 경우(NTFS를 사용하는 한 모든 Unices는 지원하고 Windows는 NT4 이후 지원) 파일의 하드 링크만 포함하는 저장소의 복사본을 만드는 것이 충분히 쉽습니다.

    cd /shared/repository
    find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" &&
                                  ln "$0" "/my/view/$0"' {} \;
    

    또는 zsh를 사용하여:

    autoload zmv
    zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
    

    편집하거나 동기화할 때 하드 링크가 깨지지 않도록 주의해야 합니다. rsync와 unison이 어떻게 대처할지 모르겠습니다. 최초 생성 후, 귀하가 소유하고 링크 수가 1개인 공유 저장소의 파일은 삭제되고, 링크 수가 1인 보기의 파일은 공유 저장소에 링크됩니다. 이것은 모두 매우 서투른 작업이므로 개선을 위한 제안을 환영합니다.

  • 공유 기기가 지원하는 경우퓨즈, 이를 사용하여 파일만 포함된 공유 저장소의 라이브 보기를 만들 수 있습니다. 나는 그것을 할 수 있는 기존 FUSE 파일 시스템을 모르지만,바인드가까워졌습니다(코딩 난이도를 평가하기 위해 코드를 살펴보지 않았습니다).

  • LD_PRELOADrsync 또는 unison을 실행할 때 재정의 (또는 Windows와 동등한 기능) 를 사용하여 readdir사용자가 소유한 파일만 반환할 수 있습니다.

관련 정보