유닉스에서 디렉터리를 비교의 줄 번호와 나란히 재귀적으로 비교하는 방법은 무엇입니까?

유닉스에서 디렉터리를 비교의 줄 번호와 나란히 재귀적으로 비교하는 방법은 무엇입니까?

내 시나리오는 다음 명령을 사용하여 diff 디렉터리를 나란히 실행하는 것입니다.

diff -ry <folder1> <folder2>

diff 출력의 줄 번호. 기본적으로 행 번호는 병렬 비교에 표시되지 않으며 이 매개변수는 에서만 --new-line-format사용할 수 없습니다 .diff -ydiff -u

내가 시도한 것은 [파일에만 해당]입니다.

diff -y <(cat -n file1) <(cat -n file2)

줄 번호를 생성합니다. 위 명령은 먼저 줄 번호를 생성한 다음 이를 diff 명령에 전달하므로 diff 결과에서 줄 번호는 변경되지 않습니다.

하지만 막상 사용하게 되었을 때 diff -ry할 수 있는 일은 아무것도 없었습니다. xargs명령에서 유사한 [전처리기와 같은] 것을 사용하여 cat -n을 적용하는 방법이 있습니까 diff -ry?

답변1

인라인 diff -ru 출력을 병렬 프레젠테이션으로 변환할 수 있습니다.줄번호 포함Python 프로그램 cdiff이라고도 불리는 색상을 사용하여 색상을 지정합니다.cdiff.pycdiff(의 래퍼와 혼동하지 마십시오 colordiff), 작성자: Matthew Wang.

링크에 제공된 제안된 설치 방법을 따르거나 cdiff.py다운로드한 스크립트를 PATH에 추출한 후 다음을 수행할 수 있습니다.

diff -ru dir1 dir2 | cdiff.py -s

답변2

스티븐 해리스훌륭한 답변이 제공되었습니다.이 질문의 이전 버전. 불행하게도 개행 문자가 포함된 파일 이름의 병리적인 경우는 처리하지 않습니다. 이것은 이 사건을 다루는 그의 답변을 약간 수정한 것입니다. ( cat -n대신에 nl, 옵션을 사용하도록 변경하기도 했습니다 -y. diff)

find folder1 -type f -exec bash -c 'for file1
do
  file2="${file1/folder1/folder2}"
  echo "Comparing $file1 to $file2"
  diff -y <(cat -n "$file1") <(cat -n "$file2")
done' bash {} +

xargsStephen의 답변에 대한 의견에서 솔루션을 요청했으므로 다음을 수행할 수 있습니다.

find folder1 -type f -print0 | xargs -0 bash -c 'for file1
do
  file2="${file1/folder1/folder2}"
  echo "Comparing $file1 to $file2"
  diff -y <(cat -n "$file1") <(cat -n "$file2")
done' bash

참고로 이러한 명령은 POSIX 쉘이 지원되지 않으므로 GNU 환경에서 완료되어야 하며 bash, POSIX가 지원되지 않으므로 솔루션은 GNU 환경에서 완료되어야 합니다. (물론, 다음으로 대체하고 삭제할 수 있지만, 그러면 개행 문자가 포함된 파일 이름을 처리하는 기능을 잃게 됩니다.)${parameter/pattern/string}xargsfind -print0xargs -0-print0-print-0

관련 정보