É possível renomear um diretório dentro de um arquivo tar? Meu caso de uso é que tenho um arquivo de especificação RPM fornecido externamente que assume um tarball com uma certa estrutura de diretórios e um tarball fornecido externamente cujo nome de diretório de nível superior não corresponde ao que o arquivo spec espera. Eu não controlo o script que gera os tarballs ou o arquivo de especificação do RPM; portanto, não posso alterar nenhum deles para corresponder ao outro.
O que venho fazendo é desenfreado, alterando o nome do diretório e, em seguida, criando um novo tarball, mas fiquei imaginando se havia uma alternativa para isso.
Respostas:
Não deve ser muito difícil, pelo menos para arquivos compatíveis com o formato antigo, onde os nomes dos arquivos são armazenados em um campo de tamanho fixo (100 bytes), mas não conheço nenhuma ferramenta que possa renomear um arquivo. arquivo em um arquivo tar. Além disso, com um arquivo compactado, você precisará criar um novo arquivo de qualquer maneira.
Deve ser ainda mais fácil, mas não conheço nenhuma ferramenta existente que possa filtrar um arquivo morto, renomeando arquivos à medida que for sendo processada. Você pode criar uma sobre as bibliotecas tar nas linguagens de script; por exemplo, aqui está um script de prova de conceito para renomear um diretório em um arquivo tar usando o Perl
Archive::Tar
. O arquivo é carregado inteiramente na memória; essa é uma limitação intrínseca deArchive::Tar
.O tar do GNU não tem a capacidade de renomear membros rapidamente, mas
pax
(o substituto do POSIX paracpio
etar
) possui. No entanto, você não pode fazerpax
a leitura e gravação de um arquivo. O que você pode fazer é expor o arquivo morto como uma árvore comum por meio do AVFS e criar um novo arquivo mortopax
. Isso mantém os nomes dos arquivos (exceto quando transformados), o conteúdo, os horários e os modos, mas redefine a propriedade do arquivo para você (a menos que seja executado como root).fonte
--transform
desde pelo menos 2010 que permite renomear arquivos em tempo real. Por exemplo, consulte: scriptsandoneliners.blogspot.com/2019/11/…--transform
permite renomear arquivos quando você cria ou extrai um arquivo morto . Mas como você renomeia arquivos em um arquivo sem extraí-lo? (Extrair não é uma boa solução: você pode não ter espaço em disco suficiente; pode não ter permissões para preservar informações de propriedade; pode não ter a capacidade de preservar os carimbos de hora exatamente ...)O hack do sr_ e a resposta do Gilles parecem muito bons, mas se o seu problema for apenas o nome do diretório raiz do tarball de destino, enquanto estiver executando o rpmbuild, uma solução diferente pode ser redefinir a
%setup
macro para renomear o diretório necessário.Algo como (você vai ter que se adaptar e refinar essa a sua configuração actual, em particular a substituição
old-dir
edesired-dir
e usando a ferramenta de descompressão direita) esta na sua~/.rpmmacros
:Eu honestamente não faria isso se não estivesse na situação mais exótica, mas a sua poderia ser o caso :)
fonte
Basta ver esta página, mas encontrou a resposta adequada em outro lugar:
http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html
Ele diz que você pode passar -n para a macro% setup para informar ao rpmbuild o nome da pasta de nível superior dentro do tarball
fonte
Corte feio, mas talvez isso ajude você, enganando os
tar
links simbólicos:Pensando nisso, provavelmente não, pois
rpm
não deixará você mexer com os argumentostar
, não é? (Edit: talvez algumtar
script de wrapper complicado$PATH
possa contornar isso.)fonte