启动rpm -ql <somerpm>
会列出 rpm 包中包含的文件和目录。严格来说,我只想列出文件,而不是目录。
是否有任何标志或命令不依赖于rpm -ql <somerpm>
单独检查每个输出是否是目录(例如[ -d $line ]
在每行的 shell 中执行测试)?
启动rpm -ql <somerpm>
会列出 rpm 包中包含的文件和目录。严格来说,我只想列出文件,而不是目录。
是否有任何标志或命令不依赖于rpm -ql <somerpm>
单独检查每个输出是否是目录(例如[ -d $line ]
在每行的 shell 中执行测试)?
似乎
rpm
没有内置选项来抑制文件列表输出中的目录。但是,您可以使用
--queryformat
选项(不带-l
)来打印每个文件的文件模式和文件名,然后将输出通过管道传输到 例如grep
以排除那些模式字段以 开头的条目d
:这仍然会打印那些实际文件条目的模式字段。为了抑制这种情况,您可以使用稍微复杂的
sed
程序:默认情况下,这将抑制输出,仅考虑那些不以开头的行
d
,并删除第一列。之前版本的答案
但是,您可以利用详细输出将打印文件的样式列表的事实
ls -l
,并将输出通过管道传输到 例如,grep
以排除权限字段以 开头的那些条目d
:请注意,这仍将保留“完整”输出样式。如果要将输出限制为实际文件名,可以将输出通过管道传输到稍微复杂的
awk
程序,该程序将仅打印最后一列,即实际文件名。我已经包含了一项检查,以查看该文件是否是符号链接,由->
倒数第二列标识,在这种情况下,它将打印链接名称而不是链接目标:然而,这会偶然发现文件名中含有空格,因此您需要小心。
有几个选项可以限制输出:
但据我所知,所有文件(并且仅文件)都没有任何内容。因此,与AdminBee 的回答类似,我建议处理输出,但使用以下
--dump
选项:检查示例包的输出(如
bash
),md5sum
目录和符号链接的 s 均为零,但如果该条目不是符号链接,则最后一列为X
。所以:仅打印目录:
仅打印符号链接:
仅打印文件:
Amazon Linux 2023 Docker 映像的输出示例:
再看一下,它
mode
也有效:似乎该模式以04
(例如040755
) 开头用于目录,以012
(例如0120777
) 开头用于符号链接,010
对于常规文件,因此可以使用它来代替。例如,要打印目录:或者列出文件:
libarchive 所使用的
bsdtar
和bsdcpio
许多图形存档提取器支持 RPM 文件,因此您可以使用它bsdtar
来将 RPMtar
即时转换为格式,并使用star
其选项按类型过滤存档成员-find
:排除
d
目录类型的文件,或者-type f
不只! -type f
包含常规文件,排除所有其他类型的文件,包括目录、符号链接、设备、fifos...或者,由于 GNU
tar
将 a 附加/
到其列表中的目录末尾,如果您可以保证 RPM 的路径中没有带有换行符的成员: