두 디렉터리를 비교하여 변경하고 스크립트에서 사용할 출력 형식을 지정합니다.

두 디렉터리를 비교하여 변경하고 스크립트에서 사용할 출력 형식을 지정합니다.

현재 두 디렉터리와 하위 디렉터리의 파일 변경 사항을 모니터링하려고 합니다. 이러한 디렉토리에는 동일한 파일 세트가 포함되어 있으며 그 중 일부는 변경되었습니다. 그래서 나는 그 diff명령을 사용하여 줄 번호와 변경 사항이 포함된 변경된 파일 목록을 만들 수 있다고 생각했습니다. 다른 스크립트를 통해 추가로 처리하려면 이 목록이 필요합니다.

해당 옵션을 사용하면 변경 사항을 재귀적으로 확인할 수 있으므로 diff -r필요에 맞게 출력 형식을 지정해 보았습니다. 기본 여러 줄 출력을 사용할 수 없지만 다음을 원합니다.

file_1:

my first line
my second line
my third line

file_2:

my first line
my changed second line
my third line

내가 원하는 출력은 다음과 같습니다.

file_2:2:my changed second line

또는 (쉽다면):

file_1:2:my second line
file_2:2:my changed second line

다음 매개변수를 사용하여 파일 이름 없이 출력을 생성했습니다.

diff -qbBwr --unchanged-line-format="" --old-line-format=":%d:%L" --new-line-format=":%dn:%L"  file_1 file_2

이로 인해

:2:my second line
:2:my changed second line

그러나 두 가지 문제가 있습니다.

  • lfmt 옵션은 재귀 옵션과 함께 사용할 수 없습니다.-r
  • 파일 이름이 안 나오네요

그래서 마지막 질문은 다음과 같습니다.

diff위에서 원하는 출력을 얻는 방식으로 두 디렉터리를 만드는 방법을 아는 사람이 있습니까 ?

답변1

나는 이것이 당신에게 필요한 일을 해야 한다고 생각합니다:

diff -r -U0 a/ b/ | awk '/^+++ / {filename=$2; next} /^@@ / {split($3,a,","); line=substr(a[1],2)} /^+/ {text=substr($0,2); print filename ":" line ":" text; line++}'

기본적으로 일반적인 재귀 비교를 수행한 다음 필요하지 않은 비트를 삭제합니다. awk는 이런 일에 좋습니다.

diff -U0다음과 같은 출력을 제공합니다.

--- a   2014-07-01 17:05:46.257447351 +0100
+++ b   2014-07-01 17:05:56.157524562 +0100
@@ -2 +2 @@
-my second line
+my changed second line

awk 스크립트는 +++파일 이름, line 의 줄 번호 @@, 줄의 텍스트를 가져와 +필수 콜론과 함께 인쇄합니다.

file_2:2:my changed second line

편집: 두 줄을 함께 편집하면 스크립트 오류가 발생하는 것을 발견했습니다. 이제 해결되었습니다.

관련 정보