2015-12-14 37 views
4

对我的基准(java/C++)进行了一些未知的更改并安装在新的rpm中。我想要一种方法来比较这个rpm的内容与旧的内容,以查看所做的更改。这可能吗?diff 2 rpms? - linux

如果没有简单的方法来做到这一点,有没有办法在日期内获得一个rpm文件名的内容列表?

+0

如果你的rpm包有更新日志,你可以运行'转--changelog -q mypackage',它会显示当前已安装的'mypackage'的更新日志。 – alvits

+0

如果您只想获取包含日期的文件列表,您可以运行'rpm -qlv mypackage'。 – alvits

+0

当我运行这些命令时,它返回:未安装程序包myRPM.rpm。我以root身份运行,并使用以下命令验证安装的软件包:rpm -q -a | grep myRPM – JavaBeast

回答

1

如果您有以前的RPM软件包文件,可以使用unrpm将其解压缩到临时目录中,并使用diff -r来比较结果。

下面是一个例子,这是我作出说明,ncurses的两个发展版本之间:

#!/bin/sh 

failed() { 
    echo "? $*" >&2 
    exit 1 
} 

# get the package filename as parameter, defaulting to one used for example 
oldpkg=$(readlink -f "${1:-/tmp/ncurses6-6.0-20150926.x86_64.rpm}") 
pkgname=$(rpm -qip "$oldpkg" 2>/dev/null | awk '/^Name .*:/ { print $3; exit 0; }') 

[ -f "$oldpkg" ] || failed "no package file found: $oldpkg" 
[ -n "$pkgname" ] || failed "no package name found in $oldpkg" 

# The tags for this question are "linux" and "rpm", so mktemp and bash are assumed. 
tempdir=$(mktemp -d "${TMPDIR:-/tmp}/pkgcompare.XXXXXX") 
trap 'rm -rf "$tempdir"' EXIT ERR 

# Fedora sets CDPATH, which would echo (cancel that). 
unset CDPATH 

mkdir -p "$tempdir"/{new-version,old-version} 

cd "$tempdir/new-version" || exit 
# the query returns absolute pathnames beginning with "/" 
rpm -ql "$pkgname" | while : 
do 
    read path 
    [ -z "$path" ] && break 
    [ -d "$path" ] && mkdir -p ".$path" 
    [ -f "$path" ] && mkdir -p "./${path%/*}" 
    [ -f "$path" ] && cp -p "$path" ".$path" 
done 

cd "$tempdir/old-version" || exit 
rpm2cpio "$oldpkg" | cpio -i -d 2>/dev/null 

cd $tempdir || exit 
# I would usually pipe this into diffstat, but you may want the actual diffs 
diff -r -u -N old-version new-version | diffstat 

和输出(仅diffstat留下,其它输出被抑制):

bin/ncursesw6-config   | 2 +- 
include/ncursesw6/curses.h  | 8 ++++---- 
include/ncursesw6/ncurses.h | 8 ++++---- 
lib64/libncurses++w6.so  |binary 
lib64/libncurses++w6.so.6  |binary 
lib64/libncurses++w6.so.6.0 |binary 
lib64/libncursesw6.so   |binary 
lib64/libncursesw6.so.6  |binary 
lib64/libncursesw6.so.6.0  |binary 
lib64/libtinfow6.so   |binary 
lib64/libtinfow6.so.6   |binary 
lib64/libtinfow6.so.6.0  |binary 
lib64/pkgconfig/formw6.pc  | 2 +- 
lib64/pkgconfig/menuw6.pc  | 2 +- 
lib64/pkgconfig/ncurses++w6.pc | 2 +- 
lib64/pkgconfig/ncursesw6.pc | 2 +- 
lib64/pkgconfig/panelw6.pc  | 2 +- 
lib64/pkgconfig/ticw6.pc  | 2 +- 
lib64/pkgconfig/tinfow6.pc  | 2 +- 
19 files changed, 16 insertions(+), 16 deletions(-) 

你当然可以对两个rpm包应用相同的方法;该问题明显表明一个已经安装,另一个可能可以访问。

+0

你介意我是否通过了最佳实践的代码? (引用扩展,在'cd'失败中中止,http://mywiki.wooledge.org/DontReadLinesWithFor,使用符合http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html约定的变量名称等)? –

+0

继续 - 这只是一个简单的例子(现在你提醒我,我看到了几个地方引用) –

+0

这将在处理源代码包时起作用。处理二进制文件时,您无法真正比​​较内容并显示差异。也许在你的回答中记下它,以便未来的读者不会感到惊讶。 – alvits

4

尝试pkgdiff到RPM包之间的显示差异:

pkgdiff PKG-0.rpm PKG-1.rpm 

如果你比较的src.rpm则该工具将提取和比较过内部压缩包(除非-skip-subarchives选项定义) 。

enter image description here

enter image description here