Como sobrescrever conteúdo em um arquivo 7z criado a partir de um pipe?

0

Propósito

Estou criando uma função que copia uma tabela de banco de dados para um arquivo 7z compactado. A saída de mysqldump é canalizada para 7zr com a opção -si . Sempre deve haver um arquivo e um arquivo somente no arquivo 7z resultante. O arquivo resultante tem um nome como database_table.sql.7z . Se minha função for chamada e o archive já existir, ela não será recriada, a menos que force=TRUE . Se force=TRUE , exclui o arquivo rm database.sql.7z e o compacta novamente. Existe uma maneira de implementar essa remoção de arquivo com rm e compactação de arquivo novamente com uma opção 7zr?

Como escrevi acima, a saída de mysqldump é canalizada para 7zr com a opção -si para que não haja arquivo "Arquivo no disco" para comparar com o "Arquivo no arquivo", conforme explicado no -u documentação da atualização .

Problema

Meu problema é que, se o arquivo já existir, o conteúdo será adicionado ao arquivo existente, em vez de sobrescrever todo o conteúdo do arquivo. Por exemplo, se eu criar um arquivo morto com:

 $ echo "Hello"| 7zr a -si hello.txt.7z
Creating archive hello.txt.7z

Compressing  [Content]      

Everything is Ok

Eu posso executar o comando uma segunda vez:

 $ echo "Hello"| 7zr a -si hello.txt.7z
Updating archive hello.txt.7z

Compressing  [Content]      

Everything is Ok

Mas a terceira vez 7zr retorna um erro:

 $ echo "Hello"| 7zr a -si hello.txt.7z

Error:
Duplicate filename:
hello.txt
hello.txt

Minha solução de recuperação é simplesmente excluir o arquivo antes de recriá-lo. Na verdade, eu gostaria de substituir o conteúdo do arquivo, mas a opção de substituição -ao só funciona para extração, não para criar um arquivo. Que switch 7zr posso usar para essa finalidade?

    
por Paul Rougieux 18.08.2017 / 12:24

1 resposta

1

'Substituir' é um pouco vago, mas digamos que você queira atualizar um arquivo existente para que ele esteja em sincronia com as alterações do diretório do qual o arquivo foi originalmente criado. Use a opção u e, em seguida, descubra o código mágico da terceira tabela nesta página link

Se eu criei o arquivo de um diretório foo como este:

7zr a foo.7z foo

Então eu posso adicionar arquivos, alterações ou exclusões ('sincronizar') a foo com isto:

7zr u foo.7z -up1q0r2y2 foo

O código mágico pode ser um pouco diferente dependendo das mudanças nas quais você está interessado (veja a primeira tabela na página).

Bastante misterioso.

Editar: Depois de algumas idas e vindas, parece que o OP requer que o arquivo seja preenchido a partir de STDIN e simplesmente queira sobrescrever o conteúdo do arquivo existente a cada vez. Os seguintes endereços que.

Você precisa especificar um "nome de arquivo" que será associado aos seus dados. Isso é feito colocando um nome após o sinalizador -si (sem espaço entre):

<input> | 7zr a -sifoo foo.7z

Este comando funciona para a criação inicial do arquivo assim como para a atualização.

Histórico: conforme visto aqui link

If file_name is not specified, data will be stored without a name

Portanto, o 7zr não terá como saber que o conteúdo existente está associado à entrada subsequente. É por isso que você vê uma nova entrada de arquivo toda vez que você atualiza. Depois de dar um nome à sua entrada, o 7zr sabe que você está tentando atualizar o que já está lá.

    
por 18.08.2017 / 13:03

Tags