차이점 : 파일명이 조금씩 다름, 동일한 파일

차이점 : 파일명이 조금씩 다름, 동일한 파일

저는 이를 diff -rqMac OS X 10.6 서버의 디렉토리를 비교하는 데 사용합니다. 폴더1에는 "파일 이름"이 있습니다. 폴더2에는 동기화하는 파일을 보관하는 파일 동기화 응용 프로그램에 의해 폴더2가 생성되었기 때문에 "filename.archive"가 있습니다.

방금 백업에서 폴더1을 추출했는데 폴더2의 내용이 최신이고 복사할 수 있는지 확인하고 싶습니다.

어떻게 해야 합니까? 특히 "file"이 "file.archive"와 동일하게 평가되고 파일 이름이 아닌 파일 내용이나 체크섬으로 비교하는 방법을 묻고 있습니다.

답변1

diff두 디렉터리의 파일 이름이 일치하지 않고 diff에는 매핑을 수행하기 위해 내장된 것이 없기 때문에 "just"를 사용하여 이를 수행할 수 없습니다 .


당신이 할 수 있는 일은 "새" 디렉터리로 변경하고 다음을 수행하는 것입니다:

for i in *; do diff "$i" /path/to/other/dir/"$i"; done

또는 복원된 백업 디렉터리로 변경하고 다음을 수행합니다.

for i in *.archive; do diff "$i" /path/to/new/dir/"${i%.archive}"; done

이것이 전체 디렉토리 구조로 확장되면 더욱 복잡해집니다. 원본 파일이 아래에 있는 경우 a백업이 아래에 임시로 복원됩니다 backup/b.

.
├── a
│   ├── p
│   │   ├── x
│   │   ├── y
│   │   └── z
│   └── q
│       ├── 1
│       ├── 2
│       └── 3
└── backup
    └── b
        ├── p
        │   ├── x.archive
        │   ├── y.archive
        │   └── z.archive
        └── q
            ├── 1.archive
            ├── 2.archive
            └── 3.archive

다음 스크립트를 실행할 수 있습니다 python toddiff.py a backup/b > todiff (todiff는 위의 트리 구조에 나열되지 않음).

import sys
import os

base = sys.argv[1]
if base[-1] != '/':
    base += '/'  # this last / needs to be removed to create bup_file_name
backup = sys.argv[2]

for root, directory_names, file_names in os.walk(base):
    for file_name in file_names:
        full_name = os.path.join(root, file_name)
        bup_file_name = os.path.join(backup, full_name.replace(base, '', 1))
        bup_file_name += '.archive'
        # adjust the diff options to your need in the following line
        print('diff -u "{}" "{}"'.format(full_name, bup_file_name))

그러면 다음 형식의 파일이 생성됩니다.

diff -u "a/q/3" "backup/b/q/3.archive"
diff -u "a/q/1" "backup/b/q/1.archive"
diff -u "a/q/2" "backup/b/q/2.archive"
.
.

그런 다음 다음을 통해 얻을 수 있습니다.source ./todiff

이 경우 다음 프로그램을 실행하는 것이 좋습니다.

관련 정보