私の場合は次のとおりです。 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を使って2つのオプションを思いつきました。
diff -u と sed を使用します。
diff -u old new | sed -n 's/^-\(.*\.so\..*\)/\1/p'
/usr/lib/libfoo.so.1
/usr/lib/libfooabc.so.1
- このコマンドは、2つのファイル間の完全なdiffを出力します。 sedを使用して「古い」ファイル(先行 - で示されている)の変更のみをフィルタリングし、
.so.
diff出力から-を削除するにはさらにフィルタリングします。逆参照を使用して他のすべてを印刷します。
diff 出力形式と grep の使用
同じものの2つの変形。 2番目の変形は短く、前の例と同じように機能します。
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無視フラグ)がありますが、正規表現を反転する必要があるときに奇妙に動作します。そんなにラッキーだったことはありません。