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


9

特定の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

回答:


13

使用dpkg -L pkgnameとgrepコマンドにパイプを探しbin/games/

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

それらがあなたの$PATHtryにあるかどうかに関係なくすべてのバイナリをチェックしたい場合は、このbash関数:

find_binaries (){
    dpkg -L "$@" | while read; 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...

bin /またはgames /の外側にbinが存在する可能性があります。
Maythux、2014

dpkg -L apache2 | egrep '(bin | games)/'結果はありません。回答を改善してください
Maythux

@Hadi apache2は悪い例かもしれません。そのパッケージは、Apacheを実行しているシステムに通常はインストールされていないメタパッケージだからです。コマンドの作品-試みcoreutilsdpkg -L coreutils | egrep '(bin|games)/'
マーティン・フォン・Wittich

1
+1、とてもいい。ほんの2、3のコメント。grep -Ew 'bin|sbin|games'代わりに使用したいかもしれません。egrepは非推奨であり、sbinも検索できます。また、forここでループを使用する理由はありません。while代わりに私の回答で行ったようにループを使用すると、IFSや単語分割について心配する必要がなくなります。
terdon

1
From man grepDirect invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.また、正規表現を使用するとを含む、gamesまたはbinを含む任意のディレクトリ/usr/share/games/、およびfoosbinaffその他のすべてと一致します。
terdon

11

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または/libudevたとえばさまざまなツール)などの場所でも実行可能ファイルを取得するため、すべてが見つかりません。したがって、-w単語全体を一致させるためにを使用すると、ファイルを正しく識別する可能性が高まりますが、パスを解析することは良い方法ではなく、代わりに上記の方法のいずれかを使用する必要があります。


実行可能/optファイル/libは、ユーザーによって呼び出されることを意図していないため、リストに含めないでください。`apt-file -F list $ package | grep -E '^(/ usr)/(s?bin | games)/'はリストを提供しますが、ひとつの例外:選択肢です。
Gilles「SO-邪悪なことをやめなさい」

@Gilles理由はわかりませんが、OPはコマンドを要求しました。これらを手動で実行するためのものかどうかは、ポイントのほかにあります。また、それらのいくつかを使用するのには十分な理由があります。たとえば、キーボードのudevルールを作成/lib/udev/findkeyboardsするときに非常に役立ちます
terdon

/lib/udev/rule_generator.functionsも役立ちます。有用なものすべてをリストし始めたら、リストする必要がある実行可能ファイルだけでなく、あらゆる種類のコードライブラリです。
Gilles「SO-邪悪なことをやめ

2

dlocateインストール済みの場合、インストール済みパッケージ内のすべてのコマンドをリストする簡単な方法があります。

dlocate -lsbin PACKAGE-NAME

だけdpkgで、標準のPATHディレクトリ内のファイルを一覧表示できます(ほとんど例外はありませんが、ほとんどすべての実行可能プログラムです)。

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

:Debianの喘鳴、ちょうど2つのよう-例外はカップルのディレクトリです/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

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

これらのメソッドはすべて、一連のプログラム(代替メカニズムを通じて提供されるプログラム)を見逃しています。たとえば、ftpパッケージの場合はnetkit-ftpとのみpftpが提供されますが、はシステムの実装の1つへのシンボリックリンクであるシンボリックリンクftpであるため、このパッケージは実際にコマンドを提供します。次のコマンド(優れたプログラミングの例ではなく、大きな1行のみ)は、現在構成されている代替メカニズムを介してパッケージによって提供されるコマンドを一覧表示します。/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、に自動的に登録されます。これにより、アンインストールされたパッケージによって提供される代替をクエリすることが困難になります(パッケージのインストールスクリプトが規則に従っていない場合、実際には技術的に不可能です)。 。


0
  1. 通常、* bin /はすべてのプログラムを配置する最も一般的な場所です。リンクを使っても。したがって、* bin /以外のコマンドを考慮する必要がある可能性はほとんどありません。
  2. apache2をインストールしていない場合、dpkg -Lきっと結果は出ません。apt-fileツールを試してください(インストールする必要があります)。
  3. apache2という名前はメタパッケージであり、プログラムは含まれていません。

-1

以下の1つのコマンドを使用して、systemdを目的のパッケージ名に置き換えます。このコマンドは、使用可能なすべてのコマンドをそれぞれ1行のイントロで一覧表示します

dpkg -L systemd | grep 'sbin\|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.