설정

설정

Windows에서 Linux로 마이그레이션한 후 Winmerge에 대한 대안을 찾거나 Linux에서 두 폴더를 비교하고 동기화하는 명령줄 도구를 배우고 싶었습니다. 명령줄에서 다음 작업을 수행하는 방법을 알려주시면 감사하겠습니다... (diff 및 rsync를 살펴봤지만 여전히 도움이 필요합니다.)

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

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

내 질문은 다음과 같습니다

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

  • B 폴더에만 존재하는 파일을 다시 A 폴더로 복사하려면 어떻게 해야 합니까?

  • 두 폴더에 있지만 타임스탬프나 크기가 다른 파일을 나열하는 방법은 무엇입니까? (마지막 동기화 이후 폴더 A에서 수정된 파일입니다. 수만 개의 파일이 있고 이로 인해 프로세스가 너무 느려질 수 있으므로 체크섬을 사용하지 않는 것이 좋습니다.)

  • 폴더 A를 폴더 B에 정확히 복사하는 방법은 무엇입니까? 내 말은, 폴더 A에만 존재하는 폴더 B의 모든 항목을 폴더 A에 복사하고 폴더 B에만 존재하는 폴더 B의 모든 항목을 삭제하되 폴더의 동일한 파일을 모두 건드리지 않는 것입니다.

답변1

이렇게 하면 폴더 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

답변2

unison펜실베이니아 대학의 Benjamin Pierce가 개발한 도구를 사용할 수 있습니다 .

두 개의 디렉터리가 있다고 가정해 보겠습니다.

/home/user/Documents/dirA/그리고/home/user/Documents/dirB/

두 가지를 동기화하려면 다음을 사용할 수 있습니다.

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

출력에는 unison각 디렉터리와 파일이 표시됩니다.다른동기화를 요청한 두 디렉터리에 있습니다. 초기 실행 시 추가 동기화를 제안한 다음(두 위치 모두에서 누락된 파일 복사), 컴퓨터에 동기화 트리를 생성 및 유지하고 후속 실행 시 실제 동기화를 구현합니다(예: file 에서 삭제하는 경우) .../dirA. .../dirB각 변경 사항을 비교하고 삭제하도록 선택할 수도 있습니다.앞으로또는취소두 디렉터리 간의 동기화.

또는 그래픽 인터페이스를 시작하려면 -ui text명령에서 옵션을 제거하면 됩니다. cli사용하는 것이 더 쉽고 빠릅니다.

더 많은 관련 콘텐츠:Unison 사용자 문서의 Unison 튜토리얼.

답변3

-cTuxForLife의 답변은 매우 훌륭하지만 로컬로 동기화할 때 사용하는 것이 좋습니다 . 원격 동기화를 위해 이 작업을 수행하는 데 시간/네트워크 비용이 들지 않는다고 주장할 수도 있지만, 로컬 파일의 경우 속도가 너무 빠르기 때문에 그만한 가치가 있습니다.

-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

답변4

너는 좀 볼 수도 있겠지Fitus/Zaloha.sh. 이는 표준 Unix 명령만을 사용하여 bash 쉘 스크립트로 구현된 동기화 장치입니다. 사용하기 쉽습니다:

$ Zaloha.sh --sourceDir="test_source" --backupDir="test_backup"

관련 정보