特定のDebianパッケージのすべてのコマンドを一覧表示

特定のDebianパッケージのすべてのコマンドを一覧表示

特定の Debian パッケージがどのコマンドを提供するかを知りたいです。

たとえば、というパッケージをインストールしたとしますx.deb。このパッケージには、私が使用できるいくつかのコマンドが確実に含まれています。

これらのコマンドをリストする方法。

compgenbashコマンドを使用してシステムで利用可能なすべてのコマンドのリストを生成できることを知っていますが、必要なのは特定のパッケージだけです。

私は解決を試みた:

dpkg -L postgresql-9.3 | egrep '(bin|games)/'
/usr/lib/postgresql/9.3/bin/pg_upgrade
/usr/lib/postgresql/9.3/bin/pg_ctl
/usr/lib/postgresql/9.3/bin/pg_resetxlog
/usr/lib/postgresql/9.3/bin/postgres
/usr/lib/postgresql/9.3/bin/pg_xlogdump
/usr/lib/postgresql/9.3/bin/initdb
/usr/lib/postgresql/9.3/bin/pg_controldata
/usr/lib/postgresql/9.3/bin/postmaster

私はコマンドを試しましたpostgres

user@userPc:~$ postgres
No command 'postgres' found, did you mean:
 Command 'postgrey' from package 'postgrey' (universe)
postgres: command not found

答え1

これを使用dpkg -L pkgnameし、grepコマンドでパイプしてbin/andを検索しますgames/

$ dpkg -L bash | grep -E '/(s?bin|games)/'
/bin/bash
/usr/bin/bashbug
/usr/bin/clear_console
/bin/rbash

すべてのバイナリが含まれているかどうかを確認するには、$PATH次のbash機能を試してください。

find_binaries (){
    dpkg -L "$@" | while read -r; do
        [ -f "$REPLY" -a -x "$REPLY" ] && echo "$REPLY"
    done
}

次のように呼び出します。

$ find_binaries postfix
...SNIP...
/usr/lib/postfix/postfix-files
/usr/lib/postfix/pipe
/usr/lib/postfix/proxymap
/usr/lib/postfix/local
/usr/lib/postfix/discard
...SNIP...

答え2

1. 作業に合わせて設計されたツールを使用します。

最も簡単で最も安定した方法は、以下をインストールすることですdlocate

sudo apt-get install dlocate

だからあなたは実行することができます

dlocate -lsbin package-name

説明したようにman dlocate

-lsbin List full path/filenames of executable files (if any) in package

2. パッケージデータベースの解析

これは@Winnyのアプローチと似ていますが、単純化されました。

apt-file -F list package | cut -d ' ' -f 2 | 
    while read file; do [[ -x $file && -f $file ]] && echo "$file"; done

まだインストールされていない場合は、apt-file次のコマンドを使用してインストールして設定できます。

sudo apt-get install apt-file
sudo apt-file update

上記のコマンドはapt-fileパッケージの内容をリストし、bashテスト-f(ファイルですか?)と-x(実行可能ですか?)をリストし、両方のテストが合格するとファイル名を印刷します。

次のコマンドのようなコマンドを使用すると、最大実行可能ファイル:

apt-file -L list package | grep -Ew 'bin|sbin'

/opt同様の場所や場所でも実行可能ファイル(/libさまざまなツールなど)を取得できるため、すべてを見つけることはできません。udevしたがって、-w単語全体を一致させるにはファイルを正しく識別する可能性が高くなりますが、パスを解析するのは良いアプローチではないため、上記のいずれかの方法を使用する必要があります。

答え3

dlocateすでにインストールされている場合は、簡単な方法がありますインストールされたパッケージのすべてのコマンドをリストします。

dlocate -lsbin PACKAGE-NAME

justを使用すると、dpkg標準のPATHディレクトリ(まれな例外を除いてほぼすべての実行可能プログラム)のファイルを一覧表示できます。

dpkg -L PACKAGE-NAME… | sed -n 's!^\(/s\?bin\|/usr/s\?bin\|/usr/games\)/!!p' | sort -u

例外はいくつかのディレクトリです。 Debian wheezy で始まる/usr/bin/mh/usr/bin/nu-mh

パッケージがインストールされていない場合は、次のものdpkg -Lと交換してくださいapt-file -F list

apt-file -F list PACKAGE-NAME… | sed -n 's!^\(/s\?bin\|/usr/s\?bin\|/usr/games\)/!!p' | sort -u

別のディレクトリに実行可能ファイルがありますが、直接実行するためのものではないため、ここでは関係ありません。

これらの方法はすべて1セットのプログラムを見逃しています。代替器具。例えば、ftpパッケージにはのみ提供されますが、netkit-ftpパッケージは実際にシステムの実装の1つへのシンボリックリンクとしてコマンドを提供します。次のコマンド(良いプログラミングの例ではなく、単に大きな1つの縮小)は、現在構成されている代替メカニズムを介してパッケージによって提供されるコマンドをリストします。pftpftp/usr/bin/ftp/etc/alternatives/ftpftp/usr/bin/netkit-ftp

perl -lwe 'foreach (`dpkg -L @ARGV`) {chomp; ++$p{$_}} foreach (</bin/* /sbin/* /usr/bin/* /usr/sbin/*>) {$e = readlink; next unless defined $e and $e =~ m!^/etc/alternatives/!; $t = readlink $e; print if $p{$t}}' PACKAGE_NAME…

他のパッケージを指す代替エントリに対して現在の設定に付属する可能性のあるコマンドを一覧表示するには、解析が必要です/var/lib/dpkg/alternatives

代替メカニズムを実装するシンボリックリンクと構成ファイルはパッケージに登録されませんが、自動的に登録されるため、削除されたpostinstパッケージによって提供される代替項目を照会することは困難です(パッケージのインストールスクリプトが規則に従わない場合、実際には技術的に不可能です。 .)

答え4

次のコマンドを使用して、systemdをターゲットパッケージの名前に置き換えます。このコマンドは、利用可能なすべてのコマンドと簡単な紹介をリストします。

dpkg -L systemd | grep 'sbin\|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null

関連情報