두 개의 다른 디렉토리에 존재하는 Diff 파일


303

동일한 파일 목록을 가진 두 개의 디렉토리가 있습니다. diff명령을 사용하여 두 디렉토리에있는 모든 파일을 비교해야합니다 . 간단한 명령 줄 옵션이 있습니까? 아니면 파일 목록을 가져 와서 반복하는 셸 스크립트를 작성해야합니까?

답변:


422

해당 diff명령을 사용할 수 있습니다 .

diff -bur folder1/ folder2/

이것은 통일 된 문맥으로 공백을 무시하는 재귀 diff를 출력합니다.

  • b 플래그는 공백을 무시하는 것을 의미합니다.
  • u 플래그는 통합 된 컨텍스트 (전후 3 줄)를 의미합니다.
  • r 플래그는 재귀를 의미합니다

9
Win32 용 GNU 유틸리티를diff 다운로드하여 명령에 액세스 할 수 있습니다 .
— Laurent Etiemble 2013

7
--brief 옵션이 유용하다는 것도 알았습니다. 변경된 파일 목록을 가져 와서 별도로 처리 할 수 ​​있습니다.
— Dariusz

27
궁금해하는 사람들에게는 -b공백 변경을 무시하고 -u3 줄의 버퍼를 제공합니다.
— rattray

28
bur 대신에 rub를 사용하면이 명령을 기억하는 것이 더 쉽다diff -rub folder1/ folder2/
— SomeGuyOnAComputer

11
내가 상상하는 것 -bur감기 기후에서 사는 경우 기억하기 쉬운 것입니다.
— AlanH

126

다른 파일 만 보려는 경우 다음을 사용할 수 있습니다.

diff -qr dir_one dir_two | sort

옵션 "q"는 내용은 다르지만 내용은 다르지만 다른 파일 만 표시하고 "정렬"은 출력을 사전 순으로 정렬합니다.


1
대단해! 또한 전체 하위 디렉토리가 디렉토리 중 하나에 만 존재하는 경우에도 효율적으로 작동합니다. 디렉토리의 하위 디렉토리에만 반복적으로 중지되고 하위 디렉토리 자체 (후속 컨텐츠없이) 만보고합니다. 아주 좋은 !!
— SomethingSothinging

어떤 경우에, 무엇을, 참조 : 이것은 정말 좋은 첫 번째 단계입니다 않습니다 다르며, 다음 A는 설명 할 diff다른 파일의 각 쌍에. 하나 또는 두 개의 파일 만 다른 경우와 수십 개의 파일이 다른 경우 사용자의 접근 방식은 크게 다릅니다. diff한 번에 수십 개의 파일을 출력하면 결과가 없어 질 수 있습니다!
— jvriesem

또한 -x PATTERN특정 하위 디렉토리를 제외하도록 명령에 포함시킬 수 있습니다 . 예를 들어, diff -qr repo1 repo2 -x ".git"두 디렉토리 (repo1 및 repo2)를 비교하지만 각 디렉토리의 .git 폴더에있는 파일은 제외합니다.
— ViFI


11

diff이 -r옵션 을 사용하면 전체 디렉토리 트리를 탐색하여 하위 디렉토리와 각 트리의 비슷한 지점에서 발생하는 파일 간의 차이를 재귀 적으로 확인할 수 있습니다.

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

3

GNU diff 인 경우 두 디렉토리를 가리키고 -r 옵션을 사용해야합니다.

그렇지 않으면, 사용해보십시오

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

NB 의견 섹션에서 Dennis가 지적한 것처럼 실제로 ls에서 명령 대체를 수행 할 필요는 없습니다. 나는이 작업을 너무 오랫동안 수행하여 자동 조종 장치 에서이 작업을 수행하고 비교를 위해 파일 목록을 가져와야하는 명령을 대체했습니다.

또한 ls의 별칭을 GNU ls에서 일시적으로 비활성화하여 GNU ls가 반환 한 목록에서 색상 형식 정보를 잃어 버리는 '\ ls'를 추가하는 것을 잊었습니다.


2
다음을 사용할 필요는 없습니다 ls.for i in ./dir1/*
— 추후 공지가있을 때까지 일시 중지되었습니다.

1
@Dennis, 펑키 단축키. +1. 나는 자동이지만 명령 대체를 수행하는 데 너무 익숙하며 필요한 명령을 사용합니다 (예 : 때로는 찾기를 사용함). ls를 사용하면 기본 시퀀스 대신 리버스 타임을 기반으로 디렉토리 목록을 더 많이 재생할 수 있습니다.
— Rob Wells

0

다음은 두 폴더의 파일 간 차이점을 보여주는 스크립트입니다. 재귀 적으로 작동합니다. dir1과 dir2를 변경하십시오.

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )

0

특히 파일의 내용을 비교하지 않고 두 디렉토리에없는 파일 만 확인하려는 경우 다른 명령으로 생성 된 파일 목록을 비교할 수 있습니다.

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'find출력 경로 앞에 루트 디렉토리를 붙이지 않도록 지시 합니다.

또한 sort두 호출에서 파일 순서가 동일하도록 추가 했습니다 find.

grep끝에서 동일한 입력 라인에 대한 정보를 제거한다.


-4

이 시도:

diff -rq /path/to/folder1 /path/to/folder2      

2
이것은 기존 답변을 복제하고 새로운 내용을 추가하지 않습니다. 실제로 새로운 내용이 없다면 답변을 올리지 마십시오.
— Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.