AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 772901
Accepted
carce-bo
carce-bo
Asked: 2024-03-22 17:24:26 +0800 CST2024-03-22 17:24:26 +0800 CST 2024-03-22 17:24:26 +0800 CST

Listar arquivos apenas no pacote rpm

  • 772

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)?

text-processing
  • 3 3 respostas
  • 191 Views

3 respostas

  • Voted
  1. Best Answer
    AdminBee
    2024-03-22T17:44:35+08:002024-03-22T17:44:35+08:00

    Parece que rpmnão há opção interna para suprimir diretórios na saída da lista de arquivos.

    No entanto, você pode usar a --queryformatopçã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, grepexcluir as entradas cujo campo de modo começa com d:

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

    Isso ainda imprimiria os campos de modo das entradas que são arquivos reais. Para suprimir isso, você pode usar um sedprograma um pouco mais complexo:

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

    Isso suprimirá a saída por padrão, considerará apenas as linhas que não começam com de 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 -llista de estilos dos arquivos e canalizará a saída, por exemplo, greppara excluir as entradas cujo campo de permissões começa com d:

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

    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 awkprograma 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:

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

    No entanto, isso irá tropeçar em nomes de arquivos com espaços em branco , então você precisa ter cuidado aqui.

    • 5
  2. muru
    2024-03-22T18:01:18+08:002024-03-22T18:01:18+08:00

    Existem algumas opções para restringir a saída:

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

    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 --dumpopção:

    --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.
    

    Inspecionando a saída de um pacote de exemplo (como bash), os md5sums 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:

      rpm -q -l --dump package | awk '$4 ~ /^0+$/ && $NF == "X" {print $1}'
      
    • Para imprimir apenas links simbólicos:

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

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

    Exemplo de saída de uma imagem Docker do Amazon Linux 2023:

    $ 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
    

    Olhando um pouco mais, modetambém funciona: parece que o modo começa com 04(por exemplo, 040755) para diretórios e 012(por exemplo, 0120777) para links simbólicos e 010para arquivos regulares, então isso poderia ser usado. Então, por exemplo, para imprimir diretórios:

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

    Ou para listar arquivos:

    rpm -q -l --dump package | awk '$(NF - 6) ~ /^010/ {print $1}'
    
    • 3
  3. Stéphane Chazelas
    2024-03-22T18:07:12+08:002024-03-22T18:07:12+08:00

    libarchive conforme usado por bsdtar, bsdcpioe muitos extratores de arquivos gráficos suportam arquivos RPM, então você pode, por exemplo, usar bsdtarpara converter o RPM para tarformatar instantaneamente e usar starpara filtrar membros do arquivo por tipo usando sua -findopção:

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

    Para excluir arquivos do tipo directory ou -type fem vez de ! -type fincluir apenas arquivos regulares , excluindo todos os outros tipos de arquivos, incluindo diretórios, links simbólicos, dispositivos, fifos...

    Ou, como o GNU taracrescenta 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:

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

relate perguntas

  • Grep para um conjunto de linhas de $START a $END AND que contém uma correspondência em $MIDDLE

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve