명령 줄 도구로 두 폴더를 동기화하는 방법은 무엇입니까?


63

Windows에서 Linux로 마이그레이션 한 후 Winmerge의 대체 소프트웨어를 찾거나 Linux에서 두 폴더를 비교하고 동기화하는 명령 줄 도구를 배우고 싶습니다. 커맨드 라인에서 다음 작업을 수행하는 방법을 말해 주시면 감사하겠습니다 ... (diff와 rsync를 연구했지만 여전히 도움이 필요합니다.)

"/ home / user / A"와 "/ home / user / B"라는 두 개의 폴더가 있습니다.

폴더 A는 일반 파일과 폴더가 저장되는 장소이고 폴더 B는 폴더 A의 전체 미러 역할을하는 백업 폴더입니다. (사용자가 폴더 B에 직접 저장하거나 수정 한 것은 없습니다.)

내 질문은 :

  • 폴더 B에만 존재하는 파일을 나열하는 방법은 무엇입니까? (예 : 마지막 동기화 이후 폴더 A에서 삭제 된 폴더)

  • 폴더 B에만 존재하는 파일을 폴더 A로 다시 복사하는 방법은 무엇입니까?

  • 두 폴더에 모두 있지만 타임 스탬프 또는 크기가 다른 파일을 나열하는 방법은 무엇입니까? (마지막 동기화 후 폴더 A에서 수정 된 파일. 수만 개의 파일이 있고 프로세스가 너무 느리기 때문에 체크섬 사용을 피하고 싶습니다.)

  • 폴더 A를 폴더 B에 정확하게 복사하는 방법은 무엇입니까? 즉, 폴더 A에서 폴더 A에만있는 폴더 B로 모든 것을 복사하고 폴더 B에만있는 폴더 B에서 모든 폴더를 삭제하지만 두 폴더에서 동일한 파일을 건드리지 마십시오.


적절한 백업 프로그램을 사용하지 않는 이유는 무엇입니까? 이중성이 하나의 예입니다.
Qudit

답변:


88

폴더 A를 폴더 B에 넣습니다.

rsync -avu --delete "/home/user/A" "/home/user/B"  

폴더 A와 B내용을 동일 /home/user/A/하게하려면 소스로 슬래시를 사용하십시오. 이것은 폴더 A가 아니라 모든 내용이며 폴더 B에 넣습니다.

rsync -avu --delete "/home/user/A/" "/home/user/B"
  • -a 모든 파일 시스템 속성을 유지하면서 동기화 수행
  • -v 장황하게 달리다
  • -u 수정 시간이 더 최근 인 파일 만 복사 (또는 시간이 같은 경우 크기 차이)
  • --delete 소스에 존재하지 않는 대상 폴더의 파일을 삭제하십시오.

맨 페이지 : https://download.samba.org/pub/rsync/rsync.html


7
rsync : rsync app 실행, -a : 모든 파일 시스템 속성을 유지하면서 동기화 수행 -v : verbosely 실행 -z : 동기화 중 데이터 압축 (데이터를 압축 모드로 전송), --delete : 대상에서 파일 삭제 소스에없는 폴더 / home / user / A : 소스 폴더, / home / user / B : 대상 폴더
SonicARG

안녕하세요 SonicARG, 나는 이것으로 돌아와 설명을 넣는 것을 잊었습니다. 설명을 제출해 주셔서 감사합니다.
TuxForLife

6
Rsync는 주로 다른 컴퓨터간에 파일을 복사하기위한 것입니다. 여기에서 설명하는 것처럼 디렉터리 동기화 목적도 제공 할 수 있습니다. 따라서 -z 옵션은 네트워크 트래픽을 줄이고 두 컴퓨터 간의 rsync 성능을 향상시키는 데 흥미가 있습니다. (디스크에서 데이터 읽기-> 압축) === network ===> (압축 해제-> 디스크에 쓰기)- z 같은 호스트에서 2 개의 디렉토리를 동기화하는 것은 약간 바보
스럽고

@GerritCap, 내가 편집했다, 당신의 소중한 의견을 주셔서 감사합니다
TuxForLife

1
명령을 시도했지만 /home/user/B/AA의 내용을 B의 내용으로 덮어 쓰지 않고 하위 디렉토리 를 만듭니다 . 좀 봐 주시겠습니까?
누가

10

당신은 할 수 unisonU 펜에서 벤자민 피어스에 의해 도구를 개발했다.

두 개의 디렉토리가 있다고 가정 해 봅시다.

/home/user/Documents/dirA//home/user/Documents/dirB/

이 두 가지를 동기화하기 위해 다음을 사용할 수 있습니다.

~ $unison -ui text /home/user/Documents/dirA/ /home/user/Documents/dirB/

출력에서 동기화하도록 요청한 두 디렉토리에서 다른unison 각각의 모든 디렉토리와 파일이 표시됩니다 . 초기 실행시 추가 동기화 (두 위치에서 누락 된 파일 복제)를 수행 한 다음 머신에서 동기화 트리를 작성 및 유지 보수하고 후속 실행에서 실제 동기화를 구현합니다 (예 :에서 파일을 삭제하는 경우). 에서 삭제 얻을 것이다 뿐만 아니라. 당신은 또한 각각의 모든 변화를 비교하고 선택적으로 선택할 수 있습니다 전달 하거나 반대로 두 디렉터리 사이에서 동기화 할 수 있습니다..../dirA.../dirB

선택적으로 그래픽 인터페이스를 시작하려면 -ui text명령 에서 옵션을 제거하기 만하면 되지만 cli더 간단하고 사용하기 쉽습니다.

이에 대한 자세한 유니슨 사용 설명서에서 유니슨 튜토리얼 .


1

TuxForLife의 답변은 꽤 좋지만 -c로컬로 동기화 할 때 사용하는 것이 좋습니다 . 원격 동기화를 수행하는 데 시간 / 네트워크 페널티는 가치가 없지만 속도가 너무 커서 로컬 파일에는 완전히 가치가 있다고 주장 할 수 있습니다.

-c, --checksum
       This forces the sender to checksum every regular file using a 128-bit  MD4
       checksum.   It  does this during the initial file-system scan as it builds
       the list of all available files. The receiver then checksums  its  version
       of  each  file  (if  it exists and it has the same size as its sender-side
       counterpart) in order to decide which files need to be updated: files with
       either  a  changed  size  or a changed checksum are selected for transfer.
       Since this whole-file checksumming of all files on both sides of the  con-
       nection  occurs  in  addition to the automatic checksum verifications that
       occur during a file's transfer, this option can be quite slow.

       Note that rsync always verifies that each transferred file  was  correctly
       reconstructed  on  the receiving side by checking its whole-file checksum,
       but that automatic after-the-transfer verification has nothing to do  with
       this  option's  before-the-transfer  "Does  this file need to be updated?"
       check.

크기와 타임 스탬프가 같은 경우 어떻게 실패 할 수 있는지 보여줍니다.

설정

$ cd /tmp

$ mkdir -p {A,b}/1/2/{3,4}

$ echo "\___________from A" | \
      tee A/1/2/x  | tee A/1/2/3/y  | tee A/1/2/4/z  | \
  tr A b | \
      tee b/1/2/x  | tee b/1/2/3/y  | tee b/1/2/4/z  | \
      tee b/1/2/x0 | tee b/1/2/3/y0 >     b/1/2/4/z0

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b

파일의 크기와 타임 스탬프가 모두 같기 때문에 아무것도 복사하지 않는 rsync

$ rsync -avu A/ b
building file list ... done

sent 138 bytes  received 20 bytes  316.00 bytes/sec
total size is 57  speedup is 0.36

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b    

체크섬을 비교하기 때문에 올바르게 작동하는 rsync

$ rsync -cavu A/ b
building file list ... done
1/2/x
1/2/3/y
1/2/4/z

sent 381 bytes  received 86 bytes  934.00 bytes/sec
total size is 57  speedup is 0.12

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from A
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from A
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from A
b/1/2/x0
\___________from b

-c와 -u가 잘 작동합니까?
Sergey Korzhov

@SergeyKorzhov 그것은 않습니다. `-u '는 목적지가 최신이 아닌 경우에만 업데이트하기 위해 평소와 같이 작동합니다.
브루노 브로 노 스키

1

개인 파일을 백업하는 데 사용하고 있습니다. 여기서는 모든 내용에 신경 쓰지 않고 -a더 유용한 정보를 인쇄하고 싶습니다.

rsync -rtu --delete --info=del,name,stats2 "/home/<user>/<src>/" "/run/media/<user>/<drive>/<dst>"

로부터 rsync를 man 페이지 :

-r, --recursive
이것은 rsync에게 디렉토리를 재귀 적으로 복사하도록 지시합니다.

-t, --times
파일과 함께 수정 시간을 전송하고 원격 시스템에서 업데이트하도록 rsync에 지시합니다.

-u, --update
이것은 rsync가 대상에 존재하고 소스 파일보다 새로운 수정 된 시간을 갖는 파일을 건너 뛰도록합니다. 기존 대상 파일의 수정 시간이 원본 파일의 수정 시간과 같으면 크기가 다른 경우 업데이트됩니다.

--delete
이것은 rsync에게 수신 측 (송신 측에없는 파일)에서 외부 파일을 삭제하되 동기화되는 디렉토리에 대해서만 삭제하도록 지시합니다.

--info = FLAGS
이 옵션을 사용하면 보려는 정보 출력을 세밀하게 제어 할 수 있습니다.

에서 rsync --info=help

DEL        Mention deletions on the receiving side  
NAME       Mention 1) updated file/dir names, 2) unchanged names  
STATS      Mention statistics at end of run (levels 1-3)

덜 명시 적이지만, 이것은 동등하고 짧게 보입니다.

rsync -rtuv --delete --info=stats2 "/home/<user>/<src>/" "/run/media/<user>/<drive>/<dst>"

-v, --verbose
단일 -v는 어떤 파일이 전송되고 있는지에 대한 정보와 마지막 [stats1]의 간략한 요약을 제공합니다.


0

이것은 요청한 것과 완전히 동일하지는 않지만 버전 관리 도구를 사용하는 것을 고려할 수 있습니다. Git과 같은 도구는 원하는 모든 작업을 수행하며 특히 폴더 B에서 직접 작업하지 않는 경우 살펴 보는 것이 흥미로울 수 있습니다. git에 대한 자세한 정보는 여기 에서 찾을 수 있습니다.


2
버전 관리에 모든 것을 추가하려는 경우에만 작동합니다. 또한 커밋 된 모든 변경 사항을 영구적으로 저장해야하므로 바람직하지 않습니다.
Qudit

@Qudit은 클로닝을 통해 히스토리를 제한하는 것이 가능하지만 히스토리를 제한하는 것은 기본적으로 Git에서 (아직?) 구현되지 않습니다.
switch87

@ switch87 예, 이전 커밋을 삭제할 수 있다는 것을 알고 있습니다. 버전 제어는 특히 일반 이진 파일이있는 경우 일반 백업에 적합한 솔루션이 아닙니다.
Qudit

그의 질문은 로컬 백업에 관한 것이지만 원격 백업에 사용하면 더 큰 파일에 git annex를 사용할 수 있습니다. 로컬 백업의 경우 이것은 문제가되지 않습니다.
switch87

2
@ switch87 이것은 git을 사용하여 백업을 수행하는 방법을 설명하지 않기 때문에 실제로 Q에 대한 의견이어야하며 대답은 아닙니다.
slm

0

이 방법으로 사용할 수 있습니다 :

rsync -avu --delete /home/user/A/* /home/user/B/

이렇게하면 폴더 A의 내용이 아니라 폴더 A의 내용을 폴더 B로 복사합니다.

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