your programing

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

lovepro 2020. 10. 5. 20:33
반응형

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


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

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

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

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

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


-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'로 끝나는 모든 파일 또는 하위 디렉토리를 무시합니다.


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

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

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

보완적인 --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 

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

diff --brief DIR1 DIR2 | grep tmpl


편리하다고 생각되면 다음을 사용할 수 있습니다 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

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

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

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


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

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

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

참고 URL : https://stackoverflow.com/questions/3775377/how-do-you-diff-a-directory-for-only-files-of-a-specific-type

반응형