"diff -r"의 기계 판독 가능 출력

"diff -r"의 기계 판독 가능 출력

두 디렉토리를 비교하기 위해 기계가 읽을 수 있는 출력이 있습니까 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내용이 다를 수 있습니다.

관련 정보