%20v%C3%A1rios%20arquivos%20RPM%2C%20cada%20um%20agrupado%20em%20arquivos%20TAR%20diferentes.png)
Eu queria saber quais são as melhores soluções possíveis para extrair cada arquivo RPM de uma lista de pacotes TAR e obter as informações do pacote desses arquivos.
Então, eu tenho uma lista de pacotes tar em um diretório, contendo pelo menos um RPM. Para estes, tentei a solução mais simples para fazer um loop, extrair e, em seguida, atingir o pico em cada pacote RPM usando um script bash, o que está demorando uma quantidade significativa de tempo, já que os pacotes TAR têm mais de 20 anos.
Também tentei a extração em massa usando cat *.tar | tar -xvf - -i
, rpm -qp #list of files
para obter os nomes dos pacotes, o que me proporcionou uma melhoria em relação à minha última abordagem.
Eu sei que poderia espiar o pacote TAR e obter o nome do arquivo .rpm, mas como o nome do arquivo que contém um pacote não tem nada a ver com o nome do pacote, preciso verificar o pacote RPM também.
A solução mais próxima que pude tentar foi:
# given tarball-containing-wget-rpm-package.tar.gz contains wget.rpm
bash$ time (cat tarball-containing-wget-rpm-package.tar.gz|gunzip|tar --wildcards --extract '*.rpm' --to-stdout|rpm -qp /dev/stdin)
wget-1.11.4-1.40.1
real 0m0.049s
user 0m0.044s
sys 0m0.004s
o que é muito rápido, mas não fornece informações corretas se um pacote TAR contém mais de um arquivo RPM.
Então, o que estou perguntando é:
- Posso extrair em massa todos os arquivos TAR para stdout e espiar os arquivos RPM?
- Posso realizar esta operação sem extrair os arquivos do pacote TAR?
- Como posso modificar o comando acima para funcionar com um único pacote TAR contendo vários RPM?
Responder1
Dado que o rpm
comando pode processar corretamente um arquivo stdin
e falhar quando há vários arquivos envolvidos, a abordagem a seguir é uma solução potencial.
Com GNU tar
, você pode usar a --to-command
opção de enviar o conteúdo de cada arquivo para o rpm
comando.
tar -zf tarball.gz --wildcards --extract '*.rpm' --to-command='rpm -qp /dev/stdin'
Demanual:
--to-command=command
Extraia arquivos e canalize seu conteúdo para a entrada padrão decomando. Quando esta opção é usada, em vez de criar os arquivos especificados, tar invocacomandoe direciona o conteúdo dos arquivos para sua saída padrão. Ocomandopode conter argumentos de linha de comando (consulte Executando comandos externos, para obter mais detalhes).
Notar quecomandoé executado uma vez para cada arquivo regular extraído. Arquivos não regulares (diretórios, etc.) são ignorados quando esta opção é usada.