내 시나리오는 다음 명령을 사용하여 diff 디렉터리를 나란히 실행하는 것입니다.
diff -ry <folder1> <folder2>
diff 출력의 줄 번호. 기본적으로 행 번호는 병렬 비교에 표시되지 않으며 이 매개변수는 에서만 --new-line-format
사용할 수 없습니다 .diff -y
diff -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 {} +
xargs
Stephen의 답변에 대한 의견에서 솔루션을 요청했으므로 다음을 수행할 수 있습니다.
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}
xargs
find -print0
xargs -0
-print0
-print
-0