这是我的案例 - 我有一个名为 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 忽略标志),但当您需要反转正则表达式时,它的行为很奇怪。我从来没有这么幸运过。