디렉토리에서 여러 파일을 비교하는 방법은 무엇입니까?


19

diff디렉토리의 두 사본에서 동일한 이름의 모든 파일 (예 : 작업 및 백업) 사이에서 s 를 찾으려고 합니다. 예를 들어, diff둘 다 같은 이름의 파일 두 개를 사용할 수 있습니다 .

> diff d1/f.cpp d2/f.cpp

또는 디렉토리에서 차이점을 찾을 수 있습니다.

> diff d1 d2

그러나 *.cpp파일 간의 차이점 만 어떻게 찾을 수 있습니까?

> diff d1/*.cpp d2/*.cpp

작동하지 않는 것 같습니다 (명확한 이유로).

[아마도 루프로 해결하는 것이 쉽지만 더 우아한 방법을 찾으려고합니다.]

답변:


13

각 파일에 대해 diff를 실행하는 쉘 루프를 사용할 수 있지만 d2에 파일이 포함 된 경우는 포착하지 않지만 d1에는 포함되지 않습니다. 그래도 충분할 것입니다.

for file in d1/*.cpp; do
    diff "$file" "d2/${file##*/}"
done

또는 한 줄에 모두 :

for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done

${file##*/}부분은 특수한 매개 변수 확장입니다.

파일 변수가 포함되어있는 경우 d1/hello.cpp, 다음 "${file##*/}"으로 확장됩니다 hello.cpp(파일의 값을 제외한 모든 최대, 등, 마지막 / 제거 포함)입니다.

그래서 "d2/${file##*/}"발생합니다 d2/hello.cpp그 결과 diff 명령은 이렇게이다diff d1/hello.cpp d2/hello.cpp

bash의 문자열 조작에 대한 자세한 내용은 http://mywiki.wooledge.org/BashFAQ/100 을 참조 하십시오 .

참고로, 버전 제어 시스템 (예 : subversion, git, mercurial 등)은 이러한 유형의 확산을 훨씬 쉽게 만듭니다.


나는 두 가지 위대한 답변 중 여러 파일 유형이있을 때 더 간단하다고 생각합니다 (비 루프 솔루션을 찾고 있다는 질문에서 언급 했음에도 불구하고). 추가 된 것은 명령 echo "${file##*/}";앞에 추가 diff되었으므로 실제로 비교할 파일을 알고 있습니다. 또한 @Rinzwind의 답변에서 언급 했듯이이 방법은 파일 목록이 두 디렉토리에서 정확히 동일하지 않은 경우를 다루지 않습니다.
ysap

52

diff -qr {DIR1} {DIR2} 두 디렉토리의 모든 파일을 수행합니다.

  • q 차이점 만 보여줍니다
  • r재귀 적이다. 필요하지 않은 경우 그대로 두십시오.

당신은 말할 수 없다 diff와일드 카드를 사용하여 직접하지만 당신은 추가 할 수 있습니다 :

-x PAT  --exclude=PAT
    Exclude files that match PAT.

-X FILE    --exclude-from=FILE
   Exclude files that match any pattern in FILE.

파일을 제외합니다. 따라서 *.cpp가장 쉬운 방법을 원한다면 그렇지 않은 모든 파일을 나열하는 텍스트 파일을 작성하는 것 *.cpp입니다. 다음 명령으로이를 수행 할 수 있습니다. ls -I "*.cpp" > excluded_files여기서 -I "*.cpp"인수는 모든 .cpp 파일을 무시합니다. 따옴표가 필요합니다.


간단하고 완벽하게 작동합니다.
Jose Gómez

4

질문을 한 후 얼마 후 melddiff 유틸리티를 찾아서 사용하고 있습니다. 이것은 파일과 디렉토리를 비교하고 병합하는 것을 매우 쉬운 작업으로 만드는 훌륭한 GUI 기반 프로그램입니다. 양방향 또는 3 방향 비교를 수행합니다.

특히, 디렉토리 내용을 색상으로 비교하여 표시하고 파일 이름을 두 번 클릭하여 특정 파일을 비교할 수 있다는 점에서 원래의 질문에 대답합니다.

3 가지 이상의 비교가 필요한 경우 gvimdiff( vim편집기 기반 )이 기능을 제공하는 것도 좋습니다.


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