자세한 내용으로 두 디렉토리 간의 차이점 얻기

자세한 내용으로 두 디렉토리 간의 차이점 얻기

두 개의 디렉토리가 있고 차이점을 이 형식으로 출력해야 합니다.

예 :

DIR1 conatins :   file1
                  file2
                  file3
DIR2 contains :   file1
                  file4

출력(파일 이름만, 파일 내용 없음): file1이 수정되거나 동일하고, file2가 제거되고, file4가 추가됩니다.

답변1

그것은 간단한 것입니다. 인기 있는 도구를 확인하십시오 diff. diff -r dir1 dir2 편집: 정보만 얻으려면 OP의 질문이 잘못되었습니다.저것파일이 다르지만어떻게서로 다르기 때문에 다음 옵션을 사용해야 합니다 -q. diff -r -q dir1 dir2

답변2

comm다음을 사용하여 또는 와 같은 도구가 join두 개의 정렬된 입력 세트를 비교하는 방법을 에뮬레이트합니다 bash.

# Get lists of (base-)names from both directories.
files1=( dir1/* ); files1=( "${files1[@]##*/}" )
files2=( dir2/* ); files2=( "${files2[@]##*/}" )

# Loop over these sorted lists until one of them is empty.
while [[ ${#files1[@]} -gt 0 ]] && [[ ${#files2[@]} -gt 0 ]]; do
        name1=${files1[0]}
        name2=${files2[0]}

        if [[ $name1 == "$name2" ]]; then
                # Name exists in both directories.
                printf '%s is modified or same\n' "$name1"
                files1=( "${files1[@]:1}" )
                files2=( "${files2[@]:1}" )
        elif [[ $name1 < $name2 ]]; then
                # Name exists in only first directory.
                printf '%s is removed\n' "$name1"
                files1=( "${files1[@]:1}" )
        else
                # Name exists in only second directory.
                printf '%s is added\n' "$name2"
                files2=( "${files2[@]:1}" )
        fi
done

# Handle remaining names.
if [[ ${#files1[@]} -gt 0 ]]; then
        printf '%s is removed\n' "${files1[@]}"
fi
if [[ ${#files2[@]} -gt 0 ]]; then
        printf '%s is added\n' "${files2[@]}"
fi

두 개의 배열을 사용하여 bash각 디렉터리에 있는 이름을 보관한 다음 이 배열 중 하나가 빌 때까지 반복합니다.

루프에서는 각 배열의 이름을 서로 비교합니다. 이름이 동일하면 파일은 동일하거나 수정되었을 수 있습니다(그러면 이름이 두 배열에서 제거됩니다).

첫 번째 배열의 이름이 두 번째 배열의 이름보다 먼저 정렬되면( 로 테스트 <) 첫 번째 이름이 두 번째 디렉터리에서 누락됩니다. 이제 첫 번째 배열의 첫 번째 요소를 삭제합니다.

그렇지 않으면 두 번째 배열의 이름이 첫 번째 디렉터리에서 누락됩니다. 이제 두 번째 배열의 첫 번째 요소를 삭제합니다.

루프 후에도 배열 중 하나가 여전히 비어 있지 않을 수 있으므로 필요한 경우 해당 배열에서 이름을 출력하십시오.

관련 정보