리눅스 병합 폴더 : rsync?


13

폴더 사본이 두 개 있습니다

src/
dest/

다음을 수행하여 병합하고 싶습니다.

파일이 단지의 경우 src, 나는 그것이로 이동하려면dest

파일이에만있는 경우 destIE를 그대로 무시하고 싶습니다.

파일이 둘 다에 있고 동일한 내용 (IE 동일한 크기 및 날짜)을 갖는 경우src

파일이 둘 다에 있고 내용이 동일 하지 않은 경우 src수동으로 병합 할 수 있도록 그대로 두십시오 .

이 마지막 범주에는 매우 적은 수의 파일 (총 파일의 0 %에서 5 % 사이) 만 있어야하지만 둘 다를 동일하게 구분하는 방법을 모르겠지만 다릅니다.

나는 이것을하는 방법을 알아 내려고 노력했지만 rsync지금까지 쓸모가 없다.

답변:


17

제한된 기능 테스트 만 수행 했으므로이 명령 (--dry-run)에주의하십시오.

rsync -avPr --ignore-existing --remove-source-files src/ dest

후행 /은 src 자체를 복사하는 대신 src로 되풀이되므로 기존 경로를 유지해야합니다.

--remove-source-files 플래그와 함께 --ignore-existing 플래그를 사용하면 src에서 dest로 동기화 된 src의 파일, 즉 이전에 dest에만 존재하지 않는 파일 만 삭제됩니다.

동기화되지 않은 파일, 즉 src /에서와 같이 dest /에 이미 존재하는 파일을 삭제하려면 다음을 사용할 수 있습니다.

for file in `find src/ -type f`; do diff $file `echo $file | sed 's/src/dest/'` && rm $file || echo $file; done

또는

find src -type f -exec bash -c 'cmp -s "$0" "${0/#src/dest}" && rm "$0"' {} \;

파일 이름에 공백 / 줄 바꾸기 /가 포함될 수있는 경우 ... 특수 문자에 대한 Gilles의 의견과 관련하여 분명히 염두에 두어야 할 솔루션이 많이 있습니다. -i를 rm에 전달하면 모든 삭제 전에 프롬프트가 표시됩니다. src / 또는 그 상위 경로를 찾기 위해 제공되는 경우, 완전한 경로는 인용없이 diff 및 rm 명령으로 모든 파일 이름을 올바르게 처리해야합니다.


수정 : 동일한 사본이 이미 dest에있는 경우 해당 명령은 src에서 파일을 제거하지 않습니다
Tok

그래 :(. 그것이 내가 알아 내기 어려운 부분이다.
David Oneill

2
: 음, 좋은 소식은 많은 번거 로움없이 독립적으로 그것을 해결할 수 있다는 것입니다 for file in `find src/ -type f`; do diff $file `echo $file | sed 's/src/dest/'` && rm $file || echo $file; done(당신이를 건너 뛸 수 있습니다 || echo $file만약 당신이 좋아하면, 그것을 완전하게하기 위해서 포함되어 있습니다)

멋진 : 그게 내가 필요한 것입니다. 당신의 대답으로 그것을 편집하면 받아 들일 것입니다!
David Oneill

@Tok : 명령은 특수 문자 (공백 \?*[,, 이니셜 -) 가 포함 된 파일 이름을 질식 시킵니다. 변수 대체에 큰 따옴표사용하고-- 파일 이름 앞에 유틸리티를 전달 하고 find … -exec …의 출력을 구문 분석하는 대신 사용 하십시오 find. 으로 rm믹스 명령, 이것은 재앙이다.
Gilles 'SO- 악마 중지'11

6

unison 은 당신이 찾고있는 도구입니다. GUI를 선호한다면 unison-gtk를 사용해보십시오. 그러나 비슷한 파일을 삭제한다고 생각하지 않습니다. 그럼에도 불구하고 1) 복사 할 파일을 쉽게 식별 할 수 있습니다. 2) 수동 병합이 필요한 항목


OP가 요구하는 것을 정확하게 수행하지는 않지만 OP의 궁극적 목표를 달성하는 것처럼 들립니다. +1
Ryan C. Thompson

+1 안타깝게도,이 서버를 실행하고있는 서버에 단일 시스템이 설치되어 있지 않거나 설치 권한이 없습니다. 그러나 이것은 다른 사람에게 좋은 대답 일 수 있습니다.
David Oneill

1
seas.upenn.edu/~bcpierce/unison//download/… 에서 unison 실행 파일을 다운로드 할 수 있습니다 . 홈 디렉토리 어딘가에 설치하면 하나의 파일 일뿐입니다.
JooMing

2

다음 스크립트는 합리적으로해야합니다. 파일을 소스에서 대상으로 이동하며 파일을 덮어 쓰거나 필요에 따라 디렉토리를 만들지 않습니다. 대상에 해당하는 다른 파일이있는 소스 파일은 일반 파일이나 디렉토리가 아닌 파일 (예 : 심볼릭 링크)과 같이 단독으로 남겨집니다. 소스에 남은 파일은 충돌이있는 파일입니다. 나는 그것을 전혀 테스트하지 않았다는 것을 명심하십시오.

cd src
find . -exec sh -c '
    set -- "/path/to/dest/$0"
    if [ -d "$0" ]; then #  the source is a directory 
      if ! [ -e "$1" ]; then
        mv -- "$0" "$1"  # move whole directory in one go
      fi
    elif ! [ -e "$0" ]; then  # the source doesn't exist after all
      :  # might happen if a whole directory was moved
    elif ! [ -e "$1" ]; then  # the destination doesn't exist
      mv -- "$0" "$1"
    elif [ -f "$1" ] && cmp -s -- "$0" "$1"; then  # identical files
      rm -- "$0"
    fi
  ' {} \;

또 다른 방법은 funionfs 또는 unionfs-fuse 와 같이 하나의 디렉토리를 다른 디렉토리 위에 통합 마운트하는 것 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.