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에서 모든 폴더를 삭제하지만 두 폴더에서 동일한 파일을 건드리지 마십시오.
답변
폴더 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
소스에 존재하지 않는 대상 폴더의 파일을 삭제하십시오.
답변
당신은 할 수 unison
U 펜에서 벤자민 피어스에 의해 도구를 개발했다.
두 개의 디렉토리가 있다고 가정 해 봅시다.
/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
더 간단하고 사용하기 쉽습니다.
이에 대한 자세한 유니슨 사용 설명서에서 유니슨 튜토리얼 .
답변
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
답변
개인 파일을 백업하는 데 사용하고 있습니다. 여기서는 모든 내용에 신경 쓰지 않고 -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]의 간략한 요약을 제공합니다.
답변
이것은 요청한 것과 완전히 동일하지는 않지만 버전 관리 도구를 사용하는 것을 고려할 수 있습니다. Git과 같은 도구는 원하는 모든 작업을 수행하며 특히 폴더 B에서 직접 작업하지 않는 경우 살펴 보는 것이 흥미로울 수 있습니다. git에 대한 자세한 정보는 여기 에서 찾을 수 있습니다.
답변
이 방법으로 사용할 수 있습니다 :
rsync -avu --delete /home/user/A/* /home/user/B/
이렇게하면 폴더 A의 내용이 아니라 폴더 A의 내용을 폴더 B로 복사합니다.