저는 이를 diff -rq
Mac 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
이 경우 다음 프로그램을 실행하는 것이 좋습니다.