‘diff -X’가 파일 이름이 아닌 특정 경로를 무시하도록하려면 어떻게해야합니까? 여러 파일이있을 수

하기:
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 참조 ).



답변

리스팅 디렉토리가 작동해야합니다. 예를 들어, 여기 스크립트에서 사용한 것이 있습니다 (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'참고 “, “는 없습니다.)


답변

같은 문제가있어서에 대한 패치를 만들었습니다 diff. 패치는 아직 승인되지 않았지만 패치를 사용하여 고유 한 버전을 빌드 diff하거나 AUR 패키지를 사용하여 Arch Linux에 설치할 수 있습니다.

다음 은 IS diff패치.


답변

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

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

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


답변

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


답변