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を使って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無視フラグ)がありますが、正規表現を反転する必要があるときに奇妙に動作します。そんなにラッキーだったことはありません。

関連情報