programing

특정 형식의 파일만 있는 디렉토리를 어떻게 구분합니까?

telecom 2023. 4. 25. 21:52
반응형

특정 형식의 파일만 있는 디렉토리를 어떻게 구분합니까?

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):

디렉토리를 비교하는 동안 일부 파일을 무시하려면 '-x PATTANGE' 또는 '--pattern='을 사용하십시오.PATTANGE' 옵션입니다.이 옵션은 기본 이름이 셸 패턴과 일치하는 파일 또는 하위 디렉터리를 무시합니다.셸에서와 달리 파일 이름 베이스 시작의 마침표는 패턴 시작의 와일드카드와 일치합니다.셸에서 PATTANGE을 확장하지 않도록 따옴표로 묶어야 합니다.예를 들어 -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과 함께 찾기를 사용하여 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 

다음 명령을 사용하여 모든 차이를 찾았습니다.*.tmpl파일링합니다.DIR1그리고.DIR2제 경우에는 잘못된 긍정 결과가 나오지 않았지만, DIRS의 내용에 따라 달라질 수 있습니다.

diff --brief DIR1 DIR2 | grep tmpl

소스를 달리하고 단순하게 유지하려면 다음과 같이 하십시오.

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

경로 중 하나에 있는 파일을 가져오려면 마지막 GREP를 제거하십시오.

만약 당신이 편하다면, 당신은 다음을 사용할 수 있습니다.Makefile "패치 만들기"를 실행합니다. '이렇게 하다'라고 합니다.

#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]*

java 파일을 찾을 수 있습니다!

하지만 실제는 피하지 않습니다.diff다른 파일들 중에서 패치 파일이나 비슷한 파일을 만드는 것이 목적이라면 이 파일을 사용할 수 있습니다.filterdiff에서요patchutils패키지(예: only only your를를를를를를를 only only only only).py이겁니다.

diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch

언급URL : https://stackoverflow.com/questions/3775377/how-do-you-diff-a-directory-for-only-files-of-a-specific-type 입니다.

반응형