두 디렉토리를 비교하고 세 번째 디렉토리의 차이점을 복사


32

우분투 12.04를 실행하면 folder1 /과 folder2 /와 같은 두 디렉토리를 비교하고 folder3 /과 다른 파일을 복사하려고합니다. 중첩 된 파일도 있으므로 일치하는 하위 디렉토리도 복사해야합니다.

나를 도울 수있는 단일 명령이 있습니까? 변경된 파일의 전체 목록을 실행할 수 있습니다.

rsync -rcnC --out-format="%f" folder1/ folder2/

그러나 rsync는 이러한 파일을 다른 대상 디렉토리로 "내보낼"기능이없는 것 같습니다. 디렉토리를 만들면서 파일을 복사 할 수 있도록 목록을 cp 또는 다른 프로그램으로 파이프 할 수 있습니까? 예를 들어, 나는 시도했다

rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/

그러나 그것은 디렉토리를 보존하지 않을 것입니다. 폴더 3 /


아마의 조합을 사용하십시오 diff -qrawk목록을 구축하고 rsync...
ewwhite

목록과 함께 rsync를 어떻게 사용합니까?
periklis

for-loop를 실행하거나 rsync --include-from=FILE옵션을 사용했습니다 .
ewwhite

(게으르지 마십시오 ...) 그러나 아래 의 rsync 솔루션 은 우아합니다.
ewwhite

답변:


37

--compare-dest를 사용하십시오.

매뉴얼 페이지에서 :

--compare-dest = DIR-이 옵션은 대상 컴퓨터에서 DIR을 추가 계층으로 사용하여 대상 파일과 전송을 비교하는 대상 파일을 비교합니다 (대상 디렉토리에 파일이없는 경우). DIR에서 발신자의 파일과 동일한 파일을 찾으면 파일이 대상 디렉토리로 전송되지 않습니다. 이는 이전 백업에서 변경된 파일의 스파 스 백업을 작성하는 데 유용합니다.

먼저 --dry-run으로 구문을 확인하십시오.

rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/

그런 다음 출력에 만족하면 :

rsync -aHxv --progress  --compare-dest=folder2/ folder1/ folder3/

링크 에는 --compare-dest scope에 대한 좋은 설명이 있습니다.


1
이것에 감사드립니다, 나는이 매개 변수에 대한 매뉴얼 페이지 설명을 이해하지 못했습니다. 관심이 있으신 rsync -rcC --compare-dest=folder2/ folder1/ folder3/
분께

OsX 사용자를위한 빠른 참고 사항. 나는이 rsync version 3.1.1 protocol version 31이해하지 못하는 내 로컬 및 rsync와에 ~/대한 경로 --compare-destPARAM을.
Jevgeni Smirnov

3
나를 --compare-dest위해, 절대 경로가 필요했습니다.
palswim

저자 또는 OP의 옵션으로 저에게 효과가 없었습니다. 즉, fonts/Makefile.in파일 을 출력 합니다. 이는 파일 folder2folder1디렉토리 모두에서 동일합니다 .
Hi-Angel

3

이 작은 스크립트는 작동해야합니다 :

folder1="firsts_folder/"
folder2="second_folder/"
folder3="target_folder"
for x in `rsync -rcnC --out-format="%n"  $folder1 $folder2`
    do
        if [ -d "$folder1/$x" ]; then
            mkdir -p "$folder3/$x"
        else
            cp -frv $folder1/$x $folder3/$x
        fi
done

그러나 diff -qr의 구문 분석 결과가 각 파일의 경로와 이름을 일관되게 제공하기 때문에 더 나은 솔루션이라고 생각합니다.

편집하다

이것은 하나의 명령이며 명령이 약간 수정되었습니다. 그러나 folder1아래에 생성 됩니다 folder3. 그리고 전체 경로에서는 작동하지 않지만 위 스크립트는 전체 경로에서는 작동하지 않습니다.

rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/

내가 사용 \"에서 rsync이 파일과 디렉토리에 공백이 포함 된 작업을 할 수 있습니다. 우분투 10.04에서 테스트되었습니다. 도움이 되길 바랍니다.


덕분에 나는 하나의 명령이 존재하기를 바랐다
periklis

2
rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/

그것이 folder1명령 을 내리기 전에 먼저 기꺼이 내려 가려는 경우에 가장 간단한 형태 입니다.

이것은 속도느린 옵션이지만 요구 사항을 충족한다고 생각하며 상대적이지 않은 디렉토리 이름을 사용하여 실행할 수 있습니다.

rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/

나는 rsync당신에게 올바른 파일 목록을 제공한다고 말했기 때문에 원래의 명령 만 내버려 두었 습니다. 그것으로).

grep출력에서 디렉토리 이름을 제거 할 수 rsync있습니다.

grep그런 다음 의 출력을 rsync사용하여 다른 출력으로 파이프합니다 xargs. 이 매개 변수 folder1/./{}에서 extra ./는 rsync에게 ./{}무시하고로 시작하는 상대 디렉토리를 만들도록 지시하는 데 사용됩니다 folder1/. 즉, 생성을 피 folder3/folder1/합니다.

CentOS 6.4에서만 이것을 테스트 할 수 있었지만 AFAIK는 Ubuntu 12.04에서 동일하게 작동합니다.

편집 : 나는 스 미디 언 의 대답이 의심 할 여지없이 더 낫다는 것을 주목해야 하지만 rsync원하는 출력을 제공했기 때문에 원래 명령 을 그대로 사용하여 찌르기를 원 했습니다.

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