diff, find, md5sum, patch 본문

Programming

diff, find, md5sum, patch

halatha 2009. 8. 17. 15:33
출처: 열씨미와 게을러의 리눅스 개발 노하우 탐험기

diff 명령을 사용할 때는 습관적으로 -u option을 같이 사용하거나, .bashrc등에 alias로 diff를 diff -u로 지정하자
alias diff='diff -u'

find(1) command의 -newer option은 해당 파일보다 더 최신 파일만을 출력
주의할 점
1. 날짜가 변경되었지만 파일 내용이 동일하면(ex. 무의미한 저장 명령으로 인한 파일 생성 시각 변경) 다시 선별을 해야 함
2. 더 최신 파일이 아니어도 직전에 변경된 파일이 존재할 수도 있음

내용을 기반으로 파일 크기가 동일해도 내용이 다른 것까지 찾으려면 md5sum을 사용
1. 기존이 되는 checksum file 생성
$ find [directory path] -newer [file name] -exec md5sum {} >> changed.md5 \;
-exec 명령을 통해 find의 결과로 찾아낸 file list를 이후 명령에 넘겨줌
{}: 결과로 찾아낸 file name으로 확장
\;의 \ 앞에는 꼭 공백 필요
2. file에 대한 checksum 검사
$ md5sum -c changed.md5
3. 변경된 file만 보기 위한 filtering
$ md5sum -c changed.md5 2>&1 | grep ": FAILED" | awk -F '{print $1}'

diff
-u: unified 형식으로 출력
-r: recursive하게 directory 탐색
-N: 존재하지 않는 파일은 비어있다고 취급
필요없는 파일 제거 --exclude
1. patch file 생성
$ diff -urN --exclude='*.tmp' [old directory path] [new directory path] > [diff file name]
2. patch 적용
$ cat ./[diff file name] | patch -p[level]
-p option: patch file에 들어있는 file name에서 slash character를 제거하는 정도를 결정

Hunk failed
Hunk: 변경 직전과 직후의 변화되지 않은 행을 포함한 논리적인 단위
일부러 한 글자를 대문자로 바꿔서 충돌을 유도한 경우
주석을 더한 후 다시 patch - 동일한 행에서 충돌만 발생하지 않으면 hunk를 탐색해서 patch를 수행한다
patch -R: 원본 파일이 담긴 디렉토리를 모두 날리고, 새로 수정한 파일이 있는 디렉토리와 패치 파일만 남은 경우
원래는 옛날 파일과 새 파일을 뒤집어서 패치를 만들었다고 가정하는 경우

참고
'소프트웨어 컨플릭트 2.0: 시대를 뛰어넘는 즐거운 논쟁', 로버트 L 글래스 저, 박재호/이해영 역, 위키북스 2007년
diff: http://en.wikipedia.org/wiki/Diff
md5: http://en.wikipedia.org/wiki/Md5sum
winmerge: http://en.wikipedia.org/wiki/WinMerge
windiff: http://en.wikipedia.org/wiki/WinDiff
xxdiff: http://furius.ca/xxdiff
KDiff3: http://kdiff3.sourceforge.net
tkdiff: http://en.wikipedia.org/wiki/Tkdiff
unified diff format: http://www.artima.com/weblogs/viewpost.jsp?thread=164293
GnuWin32: http://gnuwin32.sourceforge.net
GPL: http://www.gnu.org/copyleft/gpl.html
Comments