Bash를 통해 공유 객체의 변경 사항 찾기

Bash를 통해 공유 객체의 변경 사항 찾기

제 경우는 다음과 같습니다. say 라는 패키지가 있습니다 foo-1.2.3. 어떤 패키지가 설치되었는지 알고 싶습니다. 그래서 나는 fakeroot그것을 설치하고 설치된 모든 파일을 다음과 같은 파일에 나열했습니다.FILES

으로 업그레이드하고 싶다고 가정해 보겠습니다 foo-1.2.4. 같은 방법으로 FILES해당 파일을 만들었습니다. 공유 라이브러리의 이름이 변경되면 이에 동적으로 링크된 모든 패키지를 다시 컴파일해야 한다는 것을 이해합니다. 그래서 나에게 알리기 위해 bash 스크립트를 작성하고 싶습니다.

예를 들어, 이전 항목에 다음이 FILES포함되어 있다고 가정합니다.

/usr/lib/libfoo.so.1
/usr/lib/libfooabc.so.1
/usr/lib/something.so.1
/usr/share/doc/foo-1.2.3/whatever

FILES콘텐츠에 다음이 포함되어 있다고 가정합니다.

/usr/lib/libfoo.so.2
/usr/lib/libfooabc.so.2
/usr/lib/something.so.1
/usr/share/doc/foo-1.2.4/whatever

/usr/lib/libfoo.so.1나는 스크립트가 나에게 이 사실 과 /usr/lib/libfooabc.so.1그것이 변경되었음을 알리기를 원합니다 .

나는 이것을 시도했다

grep -F -x -f old new|grep -E *\.so\.*

하지만 old파일이 다음과 같은 경우에는 예상대로 작동하지 않습니다.

/usr/lib/libfooabc.so.1
/usr/lib/libfoo.so.1
/usr/lib/libfoo.so.2
/usr/lib/something.so.1
/usr/share/doc/foo-1.2.3/whatever

그리고 new는-

/usr/lib/libfoo.so.2
/usr/lib/libfoo.so.3
/usr/lib/libfooabc.so.2
/usr/lib/something.so.1
/usr/share/doc/foo-1.2.4/whatever

출력은 -

/usr/lib/libfoo.so.2
/usr/lib/something.so.1

원하는 출력은 -

/usr/lib/libfooabc.so.1
/usr/lib/libfoo.so.1

답변1

나는 당신에게 도움이 될 diff를 사용하여 두 가지 옵션을 생각해 냈습니다.

diff -u 및 sed를 사용하십시오.

diff -u old new | sed  -n 's/^-\(.*\.so\..*\)/\1/p'
/usr/lib/libfoo.so.1
/usr/lib/libfooabc.so.1
  • 이 명령은 두 파일 간의 전체 diff를 출력합니다. sed를 사용하여 "이전" 파일(선행 -로 표시됨)의 변경 사항만 필터링하고, .so.diff 출력에서 ​​-를 제거하려면 추가로 필터링합니다. 역참조를 사용하여 다른 모든 것을 인쇄합니다.

diff 출력 형식 및 grep 사용

동일한 것의 두 가지 변형; 두 번째 변형은 더 짧으며 이전 예제와 동일하게 작동합니다.

diff --old-line-format='%L' --unchanged-line-format= --new-line-format= old new | grep '\.so\.'

또는 약간 더 좋습니다.

diff --changed-group-format='%<' --unchanged-line-format=  old new | grep '\.so\.'

diff가 완전히 자체적으로 작업을 수행하도록 할 수도 있습니다. 정규식 필터링(-I 무시 플래그)이 있지만 정규식을 반전해야 할 때 이상하게 동작합니다. 나는 그렇게 운이 좋았던 적이 없습니다.

관련 정보