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
소스에 존재하지 않는 대상 폴더의 파일 삭제
답변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
-c
TuxForLife의 답변은 매우 훌륭하지만 로컬로 동기화할 때 사용하는 것이 좋습니다 . 원격 동기화를 위해 이 작업을 수행하는 데 시간/네트워크 비용이 들지 않는다고 주장할 수도 있지만, 로컬 파일의 경우 속도가 너무 빠르기 때문에 그만한 가치가 있습니다.
-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"