두 디렉토리의 차이점과 전체 세부정보를 확인하세요.

두 디렉토리의 차이점과 전체 세부정보를 확인하세요.

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

예:

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

commjoinET와 같은 도구가 두 개의 정렬된 입력 세트를 비교하는 방법을 시뮬레이션하려면 다음을 사용하십시오 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각 디렉터리에 있는 이름을 보관한 다음 배열 중 하나가 빌 때까지 반복합니다.

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

첫 번째 배열의 이름이 두 번째 배열의 이름 앞에 오면( test 사용 <) 첫 번째 이름이 두 번째 디렉터리에서 누락된 것입니다. 이제 첫 번째 배열의 첫 번째 요소를 삭제합니다.

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

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

관련 정보