gnu diff가 다른 폴더 구조의 파일 이름만 재귀적으로 비교할 수 있습니까?

gnu diff가 다른 폴더 구조의 파일 이름만 재귀적으로 비교할 수 있습니까?

나는 두 디렉터리를 재귀적으로 비교 diff -qr하고 차이점만 출력할 수 있다는 것을 알고 있습니다. 그러나 이는 트리 내의 파일 위치를 비교하는 것으로 나타납니다(예: /a/b/file01 != /b/c/file01).

두 개의 서로 다른 트리를 비교하고 트리에서의 위치에 관계없이 고유한 파일만 결과로 만들고 싶습니다. 따라서 위의 예에서는 file01일치하는 것으로 간주됩니다. 로 이것이 가능합니까 diff, 아니면 중첩 루프를 수행 find하고 각각을 반복해야 합니까?

답변1

나는 find다음과 같은 몇 가지 헛소리를 사용할 것입니다.

두 경로가 /a와 /b라고 가정해 보겠습니다.

find /a/ /b/ -exec basename \{} \; | sort | uniq -u

따라서 이것은 "/a 및 /b에서 모든 파일을 찾아 해당 기본 이름(예: 경로 제거)을 출력한 다음 정렬한 다음 목록에 있는 고유 값을 출력합니다"입니다.

그런 다음 디렉터리에서 이러한 파일이 있는 위치를 찾으려면 모든 것을 루프로 래핑하여 찾을 수 있습니다.

for i in `find /a/ /b/ -exec basename \{} \; | sort | uniq -u`; do find /a/ /b/ -name $i; done

답변2

으로는 불가능하다고 생각합니다 diff. 나는 당신이 다음과 같은 내용을 생각하고 있다고 가정합니다.

find tree1 -type f | while f=`line` ; do diff $f `find tree2 -type f -name "${f##*/}"`; done

tree2( 의 각 파일 에 여러 개의 인스턴스가 있거나 공백이 포함되어 있는 경우를 허용하려면 정교하게 작업해야 합니다 tree1.)

속도를 높이기 위해 할 수 있는 일은 먼저 파일 목록을 저장하는 것입니다 tree2.

find tree2 -type f >tree2.list
find tree1 -type f | while f=`line` ; do diff $f `grep <tree2.list "/${f##*/}$"`; done

이는 각 파일에 대해 디렉터리 계층 구조를 검색하는 대신 단일 파일만 검사한다는 의미입니다.

관련 정보