두 개의 디렉토리 트리가 주어지면 어떤 파일이 내용에 따라 다른지 어떻게 알 수 있습니까?


786

두 디렉토리 트리의 차이점을 찾으려면 일반적으로 다음을 실행하십시오.

diff -r dir1/ dir2/

해당 파일 간의 차이점이 정확히 출력됩니다. 내용이 다른 해당 파일 목록을 얻는 데 관심이 있습니다. 나는 이것이 단순히 명령 줄 옵션을에 전달하는 문제라고 생각 diff했지만 매뉴얼 페이지에서 아무것도 찾을 수 없었습니다.

어떤 제안?



1
디렉토리 중 하나와 관련하여 다른 디렉토리에 여분의 파일 / 디렉토리 만 얻는 방법은 무엇입니까?
Sandeepan Nath

dircmp유닉스 (리눅스 아님)에서 명령 사용
roblogic

답변:


1118

당신은 리눅스를 말했다, 그래서 당신은 운이 좋다 (적어도 그것이 언제 추가되었는지는 확실하지 않다) :

diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options

필요한 것을해야합니다.

두 디렉토리 중 하나에 존재하지 않는 파일의 차이점도 보려면 다음을 수행하십시오.

diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options

12
좋은. 그러나 더 짧고 diff -qr dir1/ dir2/확장 된 버전diff -qr dir1/ dir2/ | grep ' differ'
sobi3ch

1
@skv 왜? 답변과 같은 명령입니다. --brief바로 가기 로 만 변경 했습니다 -q.
sobi3ch

2
@skv 원래 질문과 정확히 일치하지는 않지만이 질문에 맞게 답변을 업데이트합니다.
Mark Loeser

3
@MikeMaxwell이어야합니다 --brief. 즉, 단일 옵션이 아닌 플래그 집합으로 -brief해석됩니다 -b -r -i -e -f.
daboross

2
@ daboross : 와우, 시간이 지남에 따라 유닉스 / 리눅스를 사용 해 왔으며 '-'와 '-'의 차이점이 있다는 것을 결코 깨닫지 못했습니다. (시작할 때 '-'가 존재하지 않았다고 생각합니다.) 설명해 주셔서 감사합니다!
Mike Maxwell

287

내가 사용하는 명령은 다음과 같습니다.

diff -qr dir1/ dir2/

그것은 Mark의 것과 정확히 동일합니다 :) 그러나 그의 대답은 다른 유형 의 플래그를 사용하므로 나를 귀찮게 하고 두 번 보이게했습니다. Mark의 더 자세한 플래그를 사용하면 다음과 같습니다.

diff  --brief --recursive dir1/ dir2/

다른 답변이 완벽하게 승인 된 경우 게시 해 주셔서 감사합니다. 스스로를 멈추지 못했습니다 ...


3
일관성을 완전히 고맙게 생각하지만 나쁘지 않습니다. 나는 Mark의 답변도
공표했습니다

10
.. 그래서 그냥 다른 맛을 다른 답을 넣는 것이 합리적입니까? 이모 아니! 두 답변을 하나의 일관된 답변으로 결합하는 것이 합리적입니까? 예! ;)
sobi3ch

1
그냥 질문입니다. 무엇 q을 의미합니까? 무언가의 약어입니까? 난 뒤에 어떤 논리를 찾을 수 없습니다 q..
kramer65

3
@ kramer65- "--brief"와 동일하지만 왜 q를 궁금하게 생각하십니까? 아마도 빨리? "-b"는 매뉴얼 페이지에 따라 "공백 양의 변경을 무시합니다"에 의해 취해집니다.
FPC

4
@ kramer65 나는 q입니다 quiet. 일반적으로 덜 장황한 것을 의미합니다.
Gogeta70

105

git diff --no-index dir1/ dir2/색상 차이를 표시 할 수 있기 때문에 (git config에 해당 옵션이 설정된 경우) "less"를 사용하여 긴 페이지 출력에 모든 차이를 표시하기 때문에을 사용 하고 싶습니다 .


25
산뜻한. git이 파일에 대한 저장소뿐만 아니라 임의의 디렉토리를 diff 할 수 있다고 누가 추측 했습니까?
Dan Dascalescu

2
Perl script colordiff 는 여기서 매우 유용하며 svn 및 normal diff와 함께 사용할 수 있습니다.
Felipe Alvarez

4
당신은 별도의 자식 프로젝트로 2 DIRS (나 같은)와 비교하면 / REPOS은 다음 추가 필요 --no-index에 더 stackoverflow.com/a/1792477/473390 . @ alan-porter 답변을 업데이트했습니다.
sobi3ch

나는 이것을 좋아한다. 또한 --name-status 명령 행에 추가 하면 수정 / 추가 / 삭제 상태에 대한 "M / A / D"플래그와 함께 파일 이름 목록 만 표시 된다는 것을 알았다 .
gzh

두 디렉토리에 실제로 .git 폴더가 포함되어 있기 때문에 어떻게 비교에서 제외시킬 수 있습니까?
Muhamed Cicak

35

이 두 명령은 기본적으로 요청한 것을 수행합니다.

diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt

rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt

이들 사이의 선택은 dir1과 dir2의 위치에 따라 다릅니다.

디렉토리가 두 개의 별도 드라이브에 상주하면 diff가 rsync보다 성능이 우수합니다. 그러나 비교 된 두 디렉토리가 동일한 드라이브에 있으면 rsync가 더 빠릅니다. diff는 두 디렉토리의 병렬로드를 거의 동일하게하여 두 드라이브의로드를 최대화하기 때문입니다.

rsync는 실제로 체크섬을 비교하기 전에 큰 청크로 체크섬을 계산합니다. 이를 통해 I / O 작업을 큰 청크로 그룹화하고 단일 드라이브에서 작업을 수행 할 때보다 효율적인 처리가 가능합니다.


3
rsync를뿐만 아니라 빠른 또한 하나의 드라이브에있는 파일 만, 예를 들어, 하위 디렉토리에있는 파일을 비교 allowes에 rsync --options /usr /bin /var /sbin /lib /old_root효과적으로 현재의 루트를 비교합니다 /(그 안에있는 모든 하위 디렉토리를 지정하여)와 /old_root(의 일부 오래된 백업 예를 들면 포함 /뭔가입니다), diff -r캔을 하지마 또한 크기, 권한 및 타임 스탬프가 동일한 파일이 변경되지 않았다고 가정하면 생략 --checksum하면 파일이 변경되었을 수있는 매우 빠른 검사가 제공됩니다.
Matija Nalis

1
의 목적은 무엇인가 --delete와 함께 rsync?
Tom Hale

2
--delete의 목적은 source-dir에 더 이상 존재하지 않는 destination-dir의 기존 파일을 삭제하는 것입니다.
Thomas Munk

2
이 경우 ( --dry-run플래그 사용) 아무 것도 실제로 삭제 rsync되지 않으며 dir1에 있지만 dir2에없는 파일 만 인쇄합니다.
mata

11
--dry-run실수로 잊어 버리지 않도록 항상 먼저 배치하는 것이 좋습니다 .
Dave Rager

22

Meld 는 또한 두 디렉토리를 비교할 수있는 훌륭한 도구입니다.

meld dir1/ dir2/

Meld에는 파일 또는 디렉토리를 비교할 수있는 많은 옵션이 있습니다. 두 파일이 다르면 파일 비교 모드로 들어가기 쉽고 정확한 차이점을 볼 수 있습니다.


2
좋은. 나무를 비교하는 간단한 펄 스크립트를 작성했지만 한계에 부딪 치고 있습니다. 이것은 티켓 인 것 같습니다.
David Tonhofer

유일한 문제는 그래픽 응용 프로그램이므로 스크립팅에 적합하지 않다는 것입니다. 그러나 GUI를 신경 쓰지 않으면 좋습니다! 감사.
DeanM

그 발견 meld하지만 큰 디렉토리에 사용하면 끔찍 부진된다. 큰 디렉토리를 더 잘 처리하는 것이 있습니까?
팝업

@Popup, 내가 아는 것은 아닙니다. 그래도 다음과 같은 다른 파일 이름을 찾을 수 있습니다.find dir1 dir2 | cut -d/ -f2- | sort | uniq --unique
Alexander

1
@Alexander-이 경우 meld <(find dir1 -ls ) <(find dir2 -ls)bash 프로세스 대체를 사용하여 꽤 잘 작동합니다. (zsh의 =(command)작품이 훨씬 나아졌습니다.)
Popup

10

채널 노드 '청구서'(freenode / # centos fame)는 자신의 방법을 나와 공유했습니다.

diff -Naur dir1/ dir2

최종 디렉토리 슬래시를 포함하는 것은 중요하지 않습니다.

또한 -u일부 이전 / 서버 버전의 diff에서는이 옵션을 사용할 수 없습니다.

diffs의 차이점 :

# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST

# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ

2
그래서 --new-file/-Ndiff는 누락 된 파일이 비어있는 --text/-a것으로 간주하고 모든 이진 입력을 텍스트로 간주합니다. 이 특정 사용 사례의 단점은 보이지 않습니다.
phk

4

Diffoscope 는 훌륭한 명령 줄 기반 디렉토리 diff 도구입니다.

특히 파일 로 나눌 수 있다는 점이 마음에 듭니다 .

많은 종류의 아카이브를 재귀 적으로 풀고 다양한 이진 형식을보다 읽기 쉬운 형식으로 변환하여 비교합니다. 두 개의 타르볼, ISO 이미지 또는 PDF를 쉽게 비교할 수 있습니다.

어떤 파일이 다르고 어떻게 다른지 알려줍니다.


4

diff를 찾으려면 다음 명령을 사용하십시오.

diff -qr dir1/ dir2/

-r 은 모든 서브 디렉토리도 비교합니다. -q 는 파일이 다른 경우에만 diff에게보고하도록 지시합니다.

diff  --brief dir1/ dir2/

--brief 는 디렉토리에 존재하는 파일을 보여줍니다.

그렇지 않으면

그래픽 창에 차이점을 쉽게 찾을 수있는 Meld를 ​​사용할 수 있습니다.

meld  dir1/ dir2/

2
--brief-q같은 옵션이 있습니다. 당신의 진술은 다른 것처럼 들리지만 다르지 않습니다.
Elijah Lynn

2

당신은 할 수 있습니다 또한 사용 Rsync하고 find. 의 경우 find:

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

그러나 이름과 하위 폴더는 동일하지만 내용이 다른 파일은 목록에 표시되지 않습니다.

GUI의 팬 이라면 @Alexander가 언급 한 Meld 를 확인할 수 있습니다 . 윈도우와 리눅스 모두에서 잘 작동합니다.


1

업데이트 / 동기화 동안 dirA와 dirB의 차이점을보고합니다.

rsync -auv <dirA> <dirB>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.