A inicialização rpm -ql <somerpm>
lista arquivos e diretórios contidos em um pacote rpm. Estou interessado em listar apenas os arquivos estritamente falando, não os diretórios.
Existe algum sinalizador ou comando que não dependa da verificação de cada rpm -ql <somerpm>
saída individualmente, se é um diretório (como na execução de um [ -d $line ]
teste no shell em cada linha)?
Parece que
rpm
não há opção interna para suprimir diretórios na saída da lista de arquivos.No entanto, você pode usar a
--queryformat
opção (sem-l
) para imprimir modos de arquivo e nomes de arquivo para cada arquivo e, em seguida, canalizar a saída para, por exemplo,grep
excluir as entradas cujo campo de modo começa comd
:Isso ainda imprimiria os campos de modo das entradas que são arquivos reais. Para suprimir isso, você pode usar um
sed
programa um pouco mais complexo:Isso suprimirá a saída por padrão, considerará apenas as linhas que não começam com
d
e removerá a primeira coluna.Versão anterior da resposta
No entanto, você pode usar o fato de que a saída detalhada imprimirá uma
ls -l
lista de estilos dos arquivos e canalizará a saída, por exemplo,grep
para excluir as entradas cujo campo de permissões começa comd
:Observe que isso ainda manterá o estilo de saída "completo". Se quiser restringir a saída ao nome do arquivo real, você pode canalizar a saída para um
awk
programa um pouco mais complexo que imprimirá apenas a última coluna, que é o nome do arquivo real. Incluí uma verificação para ver se o arquivo é um link simbólico, identificado como->
penúltima coluna, caso em que imprimirá o nome do link em vez do destino do link:No entanto, isso irá tropeçar em nomes de arquivos com espaços em branco , então você precisa ter cuidado aqui.
Existem algumas opções para restringir a saída:
Mas nada para todos os arquivos (e apenas arquivos) pelo que posso ver. Portanto, semelhante à resposta do AdminBee , sugiro processar a saída, mas usar a
--dump
opção:Inspecionando a saída de um pacote de exemplo (como
bash
), osmd5sum
s de ambos os diretórios e links simbólicos são todos zeros, mas se a entrada não for para um link simbólico, a última coluna seráX
. Então:Para imprimir apenas diretórios:
Para imprimir apenas links simbólicos:
Para imprimir apenas arquivos:
Exemplo de saída de uma imagem Docker do Amazon Linux 2023:
Olhando um pouco mais,
mode
também funciona: parece que o modo começa com04
(por exemplo,040755
) para diretórios e012
(por exemplo,0120777
) para links simbólicos e010
para arquivos regulares, então isso poderia ser usado. Então, por exemplo, para imprimir diretórios:Ou para listar arquivos:
libarchive conforme usado por
bsdtar
,bsdcpio
e muitos extratores de arquivos gráficos suportam arquivos RPM, então você pode, por exemplo, usarbsdtar
para converter o RPM paratar
formatar instantaneamente e usarstar
para filtrar membros do arquivo por tipo usando sua-find
opção:Para excluir arquivos do tipo
d
irectory ou-type f
em vez de! -type f
incluir apenas arquivos regulares , excluindo todos os outros tipos de arquivos, incluindo diretórios, links simbólicos, dispositivos, fifos...Ou, como o GNU
tar
acrescenta um/
ao final dos diretórios em sua listagem, se você puder garantir que o RPM não possui membros com nova linha em seus caminhos: