나는 두 디렉터리를 재귀적으로 비교 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
이는 각 파일에 대해 디렉터리 계층 구조를 검색하는 대신 단일 파일만 검사한다는 의미입니다.