起動すると、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
)の出力を確認すると、md5sum
sはディレクトリとシンボリックリンクの両方に対して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
(たとえば)で始まり、通常のファイルの場合はシンボリックリンクの場合(たとえば)で始まるように見えるため、代わりに使用できます。たとえば、目次を印刷するには:040755
012
0120777
010
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
にアーカイブメンバーをフィルタリングできます。tar
star
-find
bsdtar cf - @file.rpm | star tf - -find ! -type d
d
ディレクトリタイプのファイルを除外または埋め込む-type f
だけではなく! -type f
定期的なディレクトリ、シンボリックリンク、デバイス、fifoなどを含む他のすべての種類のファイルを除くファイル
あるいは、GNUはリストのディレクトリの末尾にtar
aを追加するので、RPMのパスに改行文字を持つメンバーがないことを保証できます。/
bsdtar cf - @file.rpm | tar tf - | grep -v '/$'