Substituição de texto dentro de arquivos compactados

2

Eu tenho vários arquivos zip, cada um com vários arquivos de texto dentro deles. Eu quero substituir todas as ocorrências de a nesses arquivos de texto com b e deixá-los compactados com a mesma estrutura.

Se eu quisesse encontrar as ocorrências de a , sei que poderia usar o zgrep comando, mas também quero executar a substituição de string. Infelizmente, não há comando zsed .

Eu não tenho escolha senão escrever um script com um loop?

    
por Daniel Hershcovich 09.02.2014 / 12:20

2 respostas

2

Se você quiser alterar o texto dos arquivos em um arquivo zip, você não terá outra opção a não ser extraí-los, editá-los e adicioná-los novamente.

Se você precisar fazer isso na maior parte do conteúdo do .zip (não pelo número de arquivos, mas pela quantidade total compactada), é mais fácil extrair tudo para um novo diretório, editar os arquivos relevantes e zipar tudo. Isto é, e. o caso ao editar todos os arquivos .html em .epub e deixar os metadados iguais, já que os metadados de re-zipping levam um tempo mínimo em comparação com o resto dos dados.

    
por 09.02.2014 / 12:25
6

Você pode trabalhar em uma montagem de um arquivo zip em um diretório, após o qual você pode explorar e modificá-lo como se fosse um diretório.

Instale o fuse-zip (disponível no gerenciador de pacotes em todas as distribuições válidas).

mount_point=$(TMPDIR=$PWD mktemp -d)
# Iterate over the .zip files in the current directory
for z in *.zip; do
  fuse-zip "$z" "$mount_point"
  # At this point, the zip contents are available through the mount point
  find "$mount_point" -type f -exec sed -i 's/a/b/g' {} +
  fusermount -u "$mount_point"
done
rmdir "$mount_point"

(Nota: Assumo a sintaxe de sed do GNU neste exemplo.)

    
por 10.02.2014 / 02:44

Tags