rpmパッケージのファイルのみを一覧表示

rpmパッケージのファイルのみを一覧表示

起動すると、rpm -ql <somerpm>rpmパッケージに含まれているファイルとディレクトリが一覧表示されます。厳密に言えば、ディレクトリではなくファイルだけをリストしたいと思います。

rpm -ql <somerpm>各出力がディレクトリかどうかを個別にチェックすることに依存しないフラグやコマンドがあります(たとえば、各行[ -d $line ]のシェルでテストを実行します)。

答え1

rpmファイルリストの出力にディレクトリを抑制する組み込みオプションがないようです。

ただし--queryformat、(なし)オプションを使用して-l各ファイルのファイルモードとファイル名を印刷し、出力をパイプしてgrepモードフィールドが次に始まるエントリを除外できますd

rpm -q --qf '[%{FILEMODES:perms} %{FILENAMES}\n]' some_rpm | grep -v '^d'

これにより、実際のファイル項目のモードフィールドが印刷され続けます。これを抑制するには、少し複雑な手順を使用できますsed

rpm -q --qf '[%{FILEMODES:perms} %{FILENAMES}\n]' some_rpm | sed -nE '/^[^d]/s/.* //p'

デフォルトでは、これは出力を抑制し、これを実行する行のみを考慮します。いいえd最初の列から始めて削除します。


以前のバージョンの回答

ls -lただし、詳細出力がファイルのスタイルリストを印刷し、出力をパイプすることで、権限grepフィールドが次に始まる項目を除外するという事実を利用できますd

rpm -ql -v some_rpm | grep -v '^d' 

これで、まだ「フル」出力スタイルが維持されます。出力を物理ファイル名に制限するには、awk実際のファイル名である最後の列のみを印刷する少し複雑なプログラムに出力をパイプできます。ファイルが->最後から2番目の列として識別されるシンボリックリンクであることを確認するチェックを含めました。この場合、リンク先の代わりにリンク名が印刷されます。

rpm -ql -v some_rpm | awk '$1 !~ /^d/ {if ($(NF-1) != "->") {print $NF;} else {print $(NF-2)}}'

しかし、これは偶然発見されるでしょうファイル名にスペースが含まれています。だから、ここに注意してください。

答え2

出力を制限するいくつかのオプションがあります。

-c, --configfiles
  List only configuration files (implies -l).

-d, --docfiles
  List only documentation files (implies -l).

しかし、ファイルのどれも(そしてただ文書)私が見ることができるものから。だから、次のようなものマネージャーミツバチの答え、出力を処理することをお勧めしますが、次の--dumpオプションを使用することをお勧めします。

--dump  Dump file information as follows:

   path size mtime md5sum mode owner group isconfig isdoc rdev symlink

This option must be used with at least one of -l, -c, -d.

サンプルパッケージ(例bash)の出力を確認すると、md5sumsはディレクトリとシンボリックリンクの両方に対して0ですが、最後の列はエントリがシンボリックリンクではない場合ですX。だから:

  • 目次のみ印刷:

    rpm -q -l --dump package | awk '$4 ~ /^0+$/ && $NF == "X" {print $1}'
    
  • シンボリックリンクのみ印刷:

    rpm -q -l --dump package | awk '$4 ~ /^0+$/ && $NF != "X" {print $1}'
    
  • ファイルを印刷してください。

    rpm -q -l --dump package | awk '$4 !~ /^0+$/ && $NF == "X" {print $1}'
    

Amazon Linux 2023 Docker イメージの出力例:

$ rpm -q bash -l --dump | awk '$4 !~ /^0+$/ && $NF == "X" {print $1}' | head # Limiting output for regular files
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
/usr/bin/alias
/usr/bin/bash
/usr/bin/bashbug-64
/usr/bin/bg
/usr/bin/cd
/usr/bin/command
/usr/bin/fc

$ rpm -q bash -l --dump | awk '$4 ~ /^0+$/ && $NF != "X" {print $1}'  # Symlinks
/usr/bin/bashbug
/usr/bin/sh
/usr/lib/.build-id/f2/caf7678bcb7e7d116f91109985f2f0209e714b
/usr/share/man/man1/bashbug-64.1.gz
/usr/share/man/man1/sh.1.gz

$ rpm -q bash -l --dump | awk '$4 ~ /^0+$/ && $NF == "X" {print $1}' # directories
/usr/lib/.build-id
/usr/lib/.build-id/f2
/usr/share/doc/bash
/usr/share/licenses/bash

もう一度見てみると、それも機能modeします。パターンはディレクトリの場合04(たとえば)で始まり、通常のファイルの場合はシンボリックリンクの場合(たとえば)で始まるように見えるため、代わりに使用できます。たとえば、目次を印刷するには:0407550120120777010

rpm -q -l --dump package | awk '$(NF - 6) ~ /^04/ {print $1}'

またはファイルのリスト:

rpm -q -l --dump package | awk '$(NF - 6) ~ /^010/ {print $1}'

答え3

RPMファイルはlibarchivebsdtarおよびbsdcpio多くのグラフィカルアーカイブ抽出機能でサポートされているため、RPMを即座にフォーマットに変換し、そのオプションを使用してタイプ別bsdtarにアーカイブメンバーをフィルタリングできます。tarstar-find

bsdtar cf - @file.rpm | star tf - -find ! -type d

dディレクトリタイプのファイルを除外または埋め込む-type fだけではなく! -type f定期的なディレクトリ、シンボリックリンク、デバイス、fifoなどを含む他のすべての種類のファイルを除くファイル

あるいは、GNUはリストのディレクトリの末尾にtaraを追加するので、RPMのパスに改行文字を持つメンバーがないことを保証できます。/

bsdtar cf - @file.rpm | tar tf - | grep -v '/$'

関連情報