특정 유형의 파일에 대해서만 디렉토리를 어떻게 비교합니까?


88

재귀 디렉토리 diff를 원하지만 특정 파일 유형에 대해서만 diff 명령에 대한 질문이 있습니다. 어떻게해야합니까?

제외 옵션을 사용해 보았지만 하나의 패턴 만 사용할 수 있습니다.

$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml

난 단지 XML 파일 형식을 제외 할 수 있습니다 명령으로, 비록 (폴더 이미지 형식의 파일이 있습니다 png, gif, jpg), txt, php, 등

특정 파일 유형 만 비교하는 방법.



따라서 특정 유형의 파일을 비교하려고하거나 해당 파일을 비교에서 제외하려고합니까? 질문은 설명과 관련이 없습니다.
def

답변:


97

-x두 번 이상 지정할 수 있습니다 .

diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2

info diff(내 시스템에서해야 할 일 info -f /usr/share/info/diff.info.gz) 의 Comparing Directories 섹션에서 :

디렉토리를 비교하는 동안 일부 파일을 무시하려면 '-x PATTERN'또는 '--exclude = PATTERN'옵션을 사용하십시오. 이 옵션은 기본 이름이 쉘 패턴 PATTERN과 일치하는 모든 파일 또는 서브 디렉토리를 무시합니다. 쉘에서와 달리 파일 이름의 시작 부분에있는 마침표는 패턴 시작 부분의 와일드 카드와 일치합니다. 쉘이 확장하지 않도록 PATTERN을 따옴표로 묶어야합니다. 예를 들어, -x '*. [ao]' 옵션 은 이름이 '.a'또는 '.o'로 끝나는 모든 파일을 무시합니다.

이 옵션은 두 번 이상 지정하면 누적됩니다. 예를 들어, -x 'RCS'-x '*, v' 옵션을 사용하면 기본 이름이 'RCS'이거나 ', v'로 끝나는 모든 파일 또는 하위 디렉토리를 무시합니다.


내 (우분투 10.04)에는 이러한 선이 없습니다. 나는 또한 시도했지만 작동하지 않았습니다. 나는 이것이 새로운 버전이라고 생각한다.
alumi

22

man 페이지 (의 버전)에서 가져옴 :

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

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

따라서 -x보고 할 때 하나의 패턴 만 허용 하는 것처럼 보이지만 제외하려는 모든 패턴을 파일 (아마도 한 줄에 하나씩)에 넣으면 두 번째 플래그를 다음과 같이 사용할 수 있습니다.

$ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats

여기서 exclude.pats는 다음과 같습니다.

*.jpg
*.JPG
*.xml
*.XML
*.png
*.gif

4
다음 명령 줄을 사용하여 <my-ext> 확장자를 제외한 모든 파일 확장자를 폴더에서 찾을 수 있습니다.find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
John

이전에 John의 의견을 알아 차렸으면했지만 macOs / bash에서 몇 가지 패턴으로 제외 파일을 생성하는 유사한 솔루션을 찾았 find . -not -name "*.c" -and -not -name "*.h" -and -type f -print0 | xargs -0 basename | grep -E '.*\..+' | sed 's/\./\//g' | xargs basename | xargs printf '*.%s\n' | sort | uniq > X-FILE습니다. Linux에서도 도움이된다고 믿고 싶습니다. (이 예에서 싱글 -name "*.[ch]"은 괜찮지 만 설명이별로 없습니다)
eruve

16

-exec와 함께 find를 사용하여 diff를 호출 할 수도 있습니다.

cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;

7

보완적인 --include ...의 부족.

하나의 해결 방법을 수행 할 수 있습니다. 제외 파일에는 모든 파일이 있지만 원하는 것은 포함됩니다. 그래서 우리 file1는 우리가 포함하고 싶은 확장자가없는 모든 파일을 찾아서 sed파일명을 잡아서 다음과 같이 만듭니다 .

diff --exclude-from=file1  PATH1/ PATH2/

예를 들면 :

find  PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 
diff PATH1/ PATH2/ -rq -X file1 

매우 유용한 한 줄짜리, thx. Mac OSX에서 grep은 약간 다릅니다. find PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
mmacvicar

3

나는 모두의 DIFF 찾으려면 다음 명령을 사용하여 *.tmpl간에 파일 DIR1DIR2. 제 경우에는 오 탐지가 발생하지 않았지만 DIRS의 내용에 따라 그럴 수도 있습니다.

diff --brief DIR1 DIR2 | grep tmpl


2

소스를 바꾸고 단순하게 유지하려면 :

diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"

경로 중 하나에 만 존재하는 파일을 얻으려면 마지막 grep을 제거하십시오.


나는 단순함을 좋아합니다 :-) 독일어 변경 grep "^Files"에서grep "^Dateien"
Erich Kuester

2

편리하다고 생각되면 다음을 사용할 수 있습니다 Makefile. 그냥 실행 : "make patch"

#Makefile for patches

#Exlude following file endings
SUFFIX += o
SUFFIX += so
SUFFIX += exe
SUFFIX += pdf
SUFFIX += swp

#Exlude following folders
FOLDER += bin
FOLDER += lib
FOLDER += Image
FOLDER += models

OPTIONS = Naur

patch: 
    rm test.patch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
        org/ new/ > test.patch  

unpatch: 
    rm test.unpatch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
    new/ org/ > test.unpatch

1

보완 적 --include가 없기 때문에 다음과 같은 복잡한 휴리스틱 패턴을 사용해야합니다.

*.[A-Zb-ik-uw-z]*

(대부분) 자바 파일을 찾으려면!


0

diff다른 파일 의 실제 를 피하지는 않지만 , 목표가 패치 파일을 생성하는 것 또는 이와 유사한 filterdiff경우 patchutils패키지 에서 사용할 수 있습니다 ( 예 .py: 변경 사항 만 패치) .

diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.