두 개의 다른 디렉토리에 존재하는 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.