[unix] 두 개의 다른 디렉토리에 존재하는 Diff 파일

동일한 파일 목록을 가진 두 개의 디렉토리가 있습니다. diff명령을 사용하여 두 디렉토리에있는 모든 파일을 비교해야합니다 . 간단한 명령 줄 옵션이 있습니까? 아니면 파일 목록을 가져 와서 반복하는 셸 스크립트를 작성해야합니까?



답변

해당 diff명령을 사용할 수 있습니다 .

diff -bur folder1/ folder2/

이것은 통일 된 문맥으로 공백을 무시하는 재귀 diff를 출력합니다.

  • b 플래그는 공백을 무시하는 것을 의미합니다.
  • u 플래그는 통합 된 컨텍스트 (전후 3 줄)를 의미합니다.
  • r 플래그는 재귀를 의미합니다

답변

다른 파일 만 보려는 경우 다음을 사용할 수 있습니다.

diff -qr dir_one dir_two | sort

옵션 “q”는 내용은 다르지만 내용은 다르지만 다른 파일 만 표시하고 “정렬”은 출력을 사전 순으로 정렬합니다.


답변

Diff는 그 옵션 -r을 가지고 있습니다.

diff -r dir1 dir2


답변

diff-r옵션 을 사용하면 전체 디렉토리 트리를 탐색하여 하위 디렉토리와 각 트리의 비슷한 지점에서 발생하는 파일 간의 차이를 재귀 적으로 확인할 수 있습니다.

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...


답변

GNU diff 인 경우 두 디렉토리를 가리키고 -r 옵션을 사용해야합니다.

그렇지 않으면, 사용해보십시오

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

NB 의견 섹션에서 Dennis가 지적한 것처럼 실제로 ls에서 명령 대체를 수행 할 필요는 없습니다. 나는이 작업을 너무 오랫동안 수행하여 자동 조종 장치 에서이 작업을 수행하고 비교를 위해 파일 목록을 가져와야하는 명령을 대체했습니다.

또한 ls의 별칭을 GNU ls에서 일시적으로 비활성화하여 GNU ls가 반환 한 목록에서 색상 형식 정보를 잃어 버리는 ‘\ ls’를 추가하는 것을 잊었습니다.


답변

다음은 두 폴더의 파일 간 차이점을 보여주는 스크립트입니다. 재귀 적으로 작동합니다. dir1과 dir2를 변경하십시오.

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )


답변

특히 파일의 내용을 비교하지 않고 두 디렉토리에없는 파일 만 확인하려는 경우 다른 명령으로 생성 된 파일 목록을 비교할 수 있습니다.

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'find출력 경로 앞에 루트 디렉토리를 붙이지 않도록 지시 합니다.

또한 sort두 호출에서 파일 순서가 동일하도록 추가 했습니다 find.

grep끝에서 동일한 입력 라인에 대한 정보를 제거한다.