Adiciona arquivos ao arquivo zip ignorando arquivos existentes com o comando zip

1

É possível pular arquivos existentes ao adicionar arquivos ao arquivo existente com o comando zip?

zip -u adiciona somente arquivos novos ou alterados, mas eu preciso adicionar apenas novos arquivos, ignorando 'alterado'.

Background (embora deva ser irrelevante): Eu tenho um arquivo zip produzido por outro processo e quero adicionar arquivos padrão, se eles estiverem faltando (não substitua os arquivos alterados pelos padrões).

    
por 9ilsdx 9rvj 0lo 28.09.2018 / 11:29

1 resposta

1

Extrair nomes de arquivos de um arquivo zip é complicado, então use o seguinte com cuidado; ele só irá manipular nomes de arquivos que não contenham espaços ou tabulações (nenhum caractere de $IFS ).

O primeiro método usa um loop com grep para perguntar, para cada arquivo solicitado, se ele já existe no arquivo; se não, o loop adiciona esse arquivo ao arquivo.

O segundo método executa um comando zip , mas informa ao zip para excluir arquivos que já estão no arquivo morto, usando a opção -x .

zipaddgrep() {
  ziparchive=$1
  shift
  for arg
  do
    if ! zipinfo -1 "$ziparchive" | grep -Fqx "$arg"
    then
        zip "$ziparchive" "$arg"
    fi
  done
}

zipaddexclude() {
  ziparchive=$1
  shift
  zip -u "$ziparchive" "$@" -x $(zipinfo -1 "$ziparchive")
}

Como demonstração:

# setup
mkdir ~/tmp/472017
cd ~/tmp/472017
mkdir thefiles
date > thefiles/file1
date > thefiles/file2
date > thefiles/file3
zip zipfile thefiles/file{1,2}

# method 1
$ set -x
$ zipaddgrep zipfile.zip thefiles/*
+ zipaddgrep zipfile.zip thefiles/file1 thefiles/file2 thefiles/file3
+ ziparchive=zipfile.zip
+ shift
+ for arg in '"$@"'
+ grep --color=auto -Fqx thefiles/file1
+ zipinfo -1 zipfile.zip
+ for arg in '"$@"'
+ grep --color=auto -Fqx thefiles/file2
+ zipinfo -1 zipfile.zip
+ for arg in '"$@"'
+ grep --color=auto -Fqx thefiles/file3
+ zipinfo -1 zipfile.zip
+ zip zipfile.zip thefiles/file3
  adding: thefiles/file3 (stored 0%)

# cleanup
rm zipfile.zip
zip zipfile thefiles/file{1,2}

# method 2
$ zipaddexclude zipfile.zip thefiles/*
+ zipaddexclude zipfile.zip thefiles/file1 thefiles/file2 thefiles/file3
+ ziparchive=zipfile.zip
+ shift
++ zipinfo -1 zipfile.zip
+ zip -u zipfile.zip thefiles/file1 thefiles/file2 thefiles/file3 -x thefiles/file1 thefiles/file2
  adding: thefiles/file3 (stored 0%)
    
por 28.09.2018 / 18:15