对我的基准(java/C++)进行了一些未知的更改并安装在新的rpm中。我想要一种方法来比较这个rpm的内容与旧的内容,以查看所做的更改。这可能吗?diff 2 rpms? - linux
如果没有简单的方法来做到这一点,有没有办法在日期内获得一个rpm文件名的内容列表?
对我的基准(java/C++)进行了一些未知的更改并安装在新的rpm中。我想要一种方法来比较这个rpm的内容与旧的内容,以查看所做的更改。这可能吗?diff 2 rpms? - linux
如果没有简单的方法来做到这一点,有没有办法在日期内获得一个rpm文件名的内容列表?
如果您有以前的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包应用相同的方法;该问题明显表明一个已经安装,另一个可能可以访问。
你介意我是否通过了最佳实践的代码? (引用扩展,在'cd'失败中中止,http://mywiki.wooledge.org/DontReadLinesWithFor,使用符合http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html约定的变量名称等)? –
继续 - 这只是一个简单的例子(现在你提醒我,我看到了几个地方引用) –
这将在处理源代码包时起作用。处理二进制文件时,您无法真正比较内容并显示差异。也许在你的回答中记下它,以便未来的读者不会感到惊讶。 – alvits
尝试pkgdiff到RPM包之间的显示差异:
pkgdiff PKG-0.rpm PKG-1.rpm
如果你比较的src.rpm则该工具将提取和比较过内部压缩包(除非-skip-subarchives选项定义) 。
如果你的rpm包有更新日志,你可以运行'转--changelog -q mypackage',它会显示当前已安装的'mypackage'的更新日志。 – alvits
如果您只想获取包含日期的文件列表,您可以运行'rpm -qlv mypackage'。 – alvits
当我运行这些命令时,它返回:未安装程序包myRPM.rpm。我以root身份运行,并使用以下命令验证安装的软件包:rpm -q -a | grep myRPM – JavaBeast