'diff -X'가 파일 이름이 아닌 특정 경로를 무시하도록하려면 어떻게해야합니까?


28

하기: diff -r -X <ignore-list> <src-dir> <dest-dir>

diff항목 <ignore-list>이 형식 인 경우 항목을 무시 하지 않는 것 같습니다 <dir>/<file>.

<file그러나> 양식의 항목은 고려됩니다. <file>다른 하위 디렉토리에 이름이 지정된 여러 파일이있을 수 있으므로 문제가됩니다. 일부 파일 은 무시하고 싶지 않습니다.

맨 페이지에는 패턴 구문에 관한 정보가 많지 않은 것 같습니다 diff. 내가 알 수 있듯이 diff에서 고려하는 파일의 기본 이름 일뿐입니다 ( 관심있는 경우 http://forums.gentoo.org/viewtopic-t-889788-start-0.html 참조 ).


남자 diff--exclude옵션이 너무 ......
Elouan Keryell-Even

답변:


30

리스팅 디렉토리가 작동해야합니다. 예를 들어, 여기 스크립트에서 사용한 것이 있습니다 (gnu diff라고 가정).

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

... .svn.gitdirs의 내용을 무시 하고 *.zip/ *.gz/ etc 라는 개별 파일도 무시합니다 .

편집 : 양식의 경로를 필터링 dir_a/file1하지만 diff기본 이름이 동일한 파일 (예 : dir_b/file1또는 dir_a/b/file1) 을 필터링하려면 diff(예 :을 사용하여 find) 생성 할 파일 목록 과 이러한 경로에서 파생 된 파일을 생성 해야합니다. 예를 들어, 주어진

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

비교할 파일 목록을 생성합니다 (예 : 제외 */a/2.txt하지만 이름이 다른 다른 파일 비교) 2.txt. 다음을 제외한 모든 파일을 "찾기"만하면됩니다 ONE/a/2.txt(regexp도 여기에서 사용할 수 있습니다 .*/a/2.txt)

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

실제로 ONE/a/2.txt(및 TWO/a/2.txt) 는 무시 하지만 여전히 이름이 지정된 다른 파일을 비교합니다 2.txt.

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

편집 : 또는 더 재미있게 find(독자의 연습으로 남은 추가 재미) 제외 할 파일이나 디렉토리를 선택한 다음 diff다른 모든 것을 선택하십시오 .

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

위의 예는 특정 파일 "{top} /a/2.txt", 이름이 "b"인 디렉토리 및 다른 모든 파일은 제외합니다. ( " -name b" 대신 단순 " "을 사용할 수 있습니다. -regex '.*/b'참고 ", "는 없습니다.)


2
고맙지 만 요점을 놓친 것 같습니다. 'base-name'을 사용할 때만 지원됩니다. 디렉토리 또는 파일 이름 일 수 있습니다. 두 경우 모두 diff는 요청한 내용을 무시합니다. 경로를 사용할 때 문제가 발생합니다. 예를 들어, / an / absolute / path / to / a / file 또는 ./a/relative/path/to/a/file을 무시하는 diff를 얻을 수 없습니다.
Ash

2
diff --exclude = "/ this / specific / file / that / im / explicitly / pleading / you / to / ignore". 작동하지 않습니다.
Ash

3
올바른 exclude패턴은 파일의 기본 이름과 일치합니다 ( gnu.org/software/diffutils/manual/html_node/…에 따라 ). 에서처럼 경로가 작동하지 않습니다 foo/bar.txt. 이를 위해서는 find파일 이름 목록을 생성하고 비교할 파일 경로를 파생 시켜야합니다 .
마이클

업데이트 대답은에서 파일 경로를 제외한 예를 포함하는 diff단지 사용하는 대신,basename
마이클

좋아, 당신이 제안하는 것을 보았지만 문제가있는 것 같습니다. 파일뿐만 아니라 디렉토리도 고려해야합니다 (예 : -type f). 이제 regexp with를 사용하여 특정 파일을 프룬 (prune) 할 수는 있지만 , 디렉토리 finddiff포함하는 입력이 있으면 해당 디렉토리 내의 파일을 통해 비교하여 이들 파일 중 일부를 무시해야 할 수도 있습니다. 다시 광장 1로.
애쉬


1

디렉토리를 제외하려면 directory/sub-directory내가 사용,

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

그러나 단일 제외에 대해서는 작동하지만 긴 무시 목록에는 사용할 수 없습니다.


-2
$ diff -rq foo.orig foo | grep -vP 'ignore1/|exclude2/' | awk '{print $2}' | cut -d'/' -f2- | xargs -I{} diff -u foo.orig/{} foo/{}

1
이것이 질문에 대한 답변이 될 수 있지만 그 이유를 설명 할 수 있다면 더 나은 답변이 될 것 입니다.
DavidPostill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.