두 개의 디렉토리가 있고 차이점을 이 형식으로 출력해야 합니다.
예:
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
ET와 같은 도구가 두 개의 정렬된 입력 세트를 비교하는 방법을 시뮬레이션하려면 다음을 사용하십시오 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 사용 <
) 첫 번째 이름이 두 번째 디렉터리에서 누락된 것입니다. 이제 첫 번째 배열의 첫 번째 요소를 삭제합니다.
그렇지 않으면 두 번째 배열의 이름이 첫 번째 디렉터리에서 누락됩니다. 이제 두 번째 배열의 첫 번째 요소를 삭제합니다.
루프가 끝난 후에도 배열 중 하나가 여전히 비어 있지 않을 수 있으므로 필요한 경우 해당 배열에 이름을 출력하십시오.