두 디렉토리를 비교하기 위해 기계가 읽을 수 있는 출력이 있습니까 diff
?
이렇게 하면 다음과 같은 diff -rq a b
결과를 얻습니다.
Only in a: aa
Only in b: bb
Files a/t and b/t differ
하지만 아마도 다음과 같은 내용을 스크립트로 설명하는 것이 더 쉬울 수도 있습니다.
- aa
+ bb
d t
답변1
예, diff -rq
사람이 이상한 이름의 파일을 접하더라도 출력은 사후 처리가 불가능합니다. 예를 들면 다음을 참조하세요.
$ ls -lFA 1 2
1:
total 20
-rw-rw-r-- 1 chazelas chazelas 5 Aug 20 10:04 a
-rw-rw-r-- 1 chazelas chazelas 2 Aug 20 10:08 'A and B'
-rw-rw-r-- 1 chazelas chazelas 5 Aug 20 10:04 'a'$'\n''b'$'\n''Only in 1: foo'
lrwxrwxrwx 1 chazelas chazelas 4 Aug 20 10:10 lsock -> sock=
lrwxrwxrwx 1 chazelas chazelas 9 Aug 20 10:04 n -> /dev/null
srwxrwxr-x 1 chazelas chazelas 0 Aug 20 10:05 sock=
lrwxrwxrwx 1 chazelas chazelas 9 Aug 20 10:06 z -> /dev/zero
2:
total 14
-rw-rw-r-- 1 chazelas chazelas 5 Aug 20 10:04 a
-rw-rw-r-- 1 chazelas chazelas 2 Aug 20 10:08 'A and B'
lrwxrwxrwx 1 chazelas chazelas 17 Aug 20 10:09 lsock -> /run/udev/control=
lrwxrwxrwx 1 chazelas chazelas 9 Aug 20 10:05 n -> /dev/zero
lrwxrwxrwx 1 chazelas chazelas 9 Aug 20 10:10 sock -> ../1/sock=
lrwxrwxrwx 1 chazelas chazelas 9 Aug 20 10:05 z -> /dev/zero
$ diff -rq 1 2
Files 1/A and B and 2/A and B differ
Only in 1: a
b
Only in 1: foo
File 1/lsock is a socket while file 2/lsock is a socket
File 1/n is a character special file while file 2/n is a character special file
이 출력에서 무엇을 얻을 수 있는지 직접 확인해 보세요.
여기서는 어떤 파일이 하나에 있고 어떤 파일이 다른 파일에 없는지 알고 두 파일 모두에 공통된 파일에 대해 해당 유형에 따라 비교하는 방법을 결정하는 경우 두 작업을 수동으로 수행하는 것이 어렵지 않습니다.
예를 들어 다음과 같습니다 zsh
.
zmodload zsh/stat
dirA=some/dir
dirB=some/other/dir
A_files=( $dirA/**/*(NDe['REPLY=${REPLY#$dirA/}']) )
B_files=( $dirB/**/*(NDe['REPLY=${REPLY#$dirB/}']) )
only_in_A=( ${A_files:|B_files} )
only_in_B=( ${B_files:|A_files} )
common_files=( ${A_files:*B_files} )
exact_same=()
different_type=()
different_content_regular=()
for file ($common_files) {
stat -LsH a -- $dirA/$file && stat -LsH b -- $dirB/$file || continue
if [[ $a[device]:$a[inode] = $b[device]:$b[inode] ]]; then
exact_same+=( $file )
elif [[ ${a[mode][1]} != ${b[mode][1]} ]]; then
different_type+=( $file )
elif [[ ${a[mode][1]} = - ]]; then
(( a[size] == b[size] )) && cmd -s -- $dirA/$file $dirB/$file ||
different_content_regular+=( $file )
else
: decide what to do with other types of files
fi
}
(검증되지 않은).
그런 다음 다양한 유형의 차이점에 대해 여러 배열을 만들고 차이점을 계산하고 처리하는 방법을 결정할 수 있습니다. 예를 들어 여러 가지 방법으로 기호 링크를 처리할 수 있습니다. 위 코드에서 $dirA/foo
및 $dirB/foo
가 동일한 심볼릭 링크(서로 하드 링크되어 있음)인 경우 위의 코드는 이를 에 추가 $exact_same
하지만 해당 디렉터리의 상대 경로를 가리키는 경우 file
내용이 다를 수 있습니다.