通过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
  • 该命令输出两个文件之间的完整差异,我们使用 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 忽略标志),但当您需要反转正则表达式时,它的行为很奇怪。我从来没有这么幸运过。

相关内容