Remover arquivos do arquivo tar

17

Eu tenho um arquivo grande foo.tar.xzque contém muitos arquivos (por exemplo, 200000). Eu descobri que esse arquivo contém alguns arquivos (cerca de 5000) que eu não quero. Não tenho espaço em disco suficiente para descompactar tudo no meu disco; Além disso, receio que atributos / direitos possam se perder se o fizer. No entanto, tenho espaço suficiente para hospedar duas cópias do arquivo compactado . Existe uma ferramenta para remover alguns arquivos do arquivo morto (especificado com uma expressão regular no nome do arquivo) em tempo real, ou seja, sem descompactar o arquivo morto em arquivos individuais?

FUZxxl
fonte

Respostas:

14

(editado, porque eu não entendi a pergunta, que também foi editada)

O melhor que você pode fazer é extrair, excluir e recomprimir o arquivo inteiro.

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

Não é possível excluir arquivos de um tar diretamente.

tar é um fluxo, originalmente destinado a unidades de fita que não fazem buscas aleatórias bem - enquanto, em teoria, seria possível em um sistema de arquivos em disco perfurar um buraco / reescrever o arquivo restante, com a compressão o ponto é discutível, como quase todos Os métodos de compactação dependem muito do conteúdo que ocorreu anteriormente no arquivo. Para fazer isso no local, você precisará de conhecimento muito detalhado sobre o método de compactação e o formato do arquivo tar. Isso é complexidade a um ponto que ninguém se incomodaria com isso. É mais barato manter os arquivos por perto e ignorá-los.

Se você precisar dessa funcionalidade, o tar provavelmente não é o que você deseja.

frostschutz
fonte
Esses arquivos representam 35% do tamanho dos arquivos. As restrições que você aponta aparentemente só se aplicam se eu reescrever o arquivo, e não se eu modificá-lo fora do local, o que posso fazer (tenho espaço suficiente para salvar o arquivo compactado duas vezes). Existe tal ferramenta?
FUZxxl 21/03
Talvez eu tenha entendido mal sua pergunta então. Se você está disposto a descompactar o tar, afinal, e reembalá-lo (apenas sem realmente criar os arquivos tarred - ou seja, um tar direto ao tar pipe), pode ser possível.
Frostschutz 21/03
Sim, eu posso fazer isso. É só que os arquivos têm uids / gids / atributos que eu preciso preservar. Além disso, não tenho espaço em disco suficiente para salvar a representação descompactada. No entanto, tenho espaço suficiente para salvar dois arquivos compactados.
FUZxxl 21/03
1
Isso não é problema. Se eu puder fazer isso de uma só vez, o tempo não será muito longo. Não consigo imaginar nenhum formato de arquivo que permita exclusão rápida enquanto libera armazenamento.
FUZxxl
1
--wildcardsajuda ... Eu tive que incluir ./no início do padrão embora ...
Gert van den Berg
14

O tar GNU tem uma --deleteopção que trabalha com arquivos também hoje em dia.

Use-o assim, por exemplo:

tar -vf yourArchive.tar --delete your/path/to/delete

Cuidado: Provavelmente não funcionará em nenhum tipo de meio de fita magnética. Mas tarnão há problemas em trabalhar em um pipe, então você pode simplesmente usar um arquivo tar temporário e substituir a fita depois. Também não funcionará em arquivos compactados, portanto, você precisará descompactar o arquivo.

Além disso, a operação será bastante lenta em qualquer caso, devido à natureza linear compactada (por design) dos arquivos tar.

Evi1M4chine
fonte
1
Existe, mas não funciona com arquivos onde o acesso aleatório não é possível (por exemplo, compactar arquivos), mas este é o meu caso de uso.
FUZxxl 31/08/16
1
O outro problema é que não consigo especificar um padrão para excluir. Observe o meu comentário de 2013, onde eu já trato das deficiências de gtar --delete.
FUZxxl 31/08/19
3
O @FUZxxl -Ttrabalha com --deletee --wildcardspermite que você use padrões em vez de nomes de arquivos, então crie um arquivo temporário contendo os padrões e o uso unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz. Não fará um regex completo (se você precisar disso, basta usar tar -te criar uma lista de nomes de arquivos para excluir), apenas padrões de nomes de arquivos correspondentes.
precisa saber é o seguinte
-4

De acordo com o manual , você pode passar uma lista de nomes de arquivos para tarextraí-los apenas. Por exemplo:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo
Don Juan dePython
fonte
Não vejo como --extract me ajuda. Você poderia elaborar? Lembre-se de que não consigo descompactar o arquivo (ou partes substanciais dele) no disco.
FUZxxl 21/03
2
Não basta postar links: este é um wiki - adicione conteúdo suficiente para que seja desnecessário que as pessoas saiam da página para entender sua resposta.
precisa saber é o seguinte