コマンドがシンボリックリンクなので、「dpkg -S」がパスを見つけることができない場合、コマンドがインストールされているパッケージをどのように見つけることができますか?

コマンドがシンボリックリンクなので、「dpkg -S」がパスを見つけることができない場合、コマンドがインストールされているパッケージをどのように見つけることができますか?

ラベル情報を作成するとき、私が見つけようとしているパッケージrenameコマンドがインストールされました。私はいつもdpkg -Sのように走った。この問題):

$ which rename
/usr/bin/rename
$ dpkg -S $(!!)
dpkg-query: no path found matching pattern /usr/bin/rename

私は通常、コマンドを手動でインストールするのではなく、/usr/binアクセス権を持つ別のコンピュータにrenameインストールします。最初の疑いは、このコマンドが一部のパッケージのインストール後の手順でコピーされたことです。

その後、1つを作成し、コマンドが実際にリンクであることをls -l /usr/bin/rename知りました。 link target()をrename試しましたが、パッケージ名も指定されていません。dpkg -S/etc/alternatives/renamedpkg -S /etc/alternatives/rename

追加の検索結果、このリンクチェーンの実際の実行可能ターゲットは/usr/bin/prename次のとおりです。dpkg -Sフォローしないシンボリックリンクの動作に関するバグレポート。レポートは2003年に作成されたもので、シンボリックリンクを追跡するオプションが見つからず、dpkg問題が解決しないようです。

コマンドがシンボリックリンクの場合、「実際の」実行可能ファイルを含むパッケージを簡単に見つけることができますか?

答え1

readlink印刷リンクを使用して場所を指すことができます。オプションのない引数はreadlinkリンクでなければならず、ファイルに渡すと何も印刷されません。-fリンクに再帰的に従うcoreutilsパッケージのオプションreadlinkそして引数がすでにファイルの場合でも、ファイル名が印刷されます。

これにより(-n出力の末尾に改行文字が表示されないreadlink):

dpkg -S "$(readlink -fn "$(which rename)")"

あなたは答えを得るでしょう:

perl: /usr/bin/prename

この場合、フォローするリンクがはっきりと表示されますが、prenameこれが本当であるという保証はありません(たとえば、リンクがrename$ PATHにないディレクトリの実行可能ファイルを指している場合など)。

realpath@011cが示すように、すでにインストールされている場合は代替として使用できます。readlink -f

関連情報