Acho que a melhor maneira de fazer isso é excluir o arquivo inteiro e fechar o diretório novamente.
O parâmetro '-d' espera que o caminho relativo do arquivo exclua arquivos do zip. A opção '-u' adiciona (ou atualiza) novos arquivos ao zip. Eles não podem ser usados juntos.
Não tenho certeza se você pode fazer a atualização / exclusão facilmente usando o comando zip. No entanto, eu escrevi um script simples abaixo, que pode fazer o que quiser. Sinta-se à vontade para editar o script - por enquanto ele requer que o arquivo e o diretório que você deseja zip / update esteja no mesmo lugar (por exemplo /home/you/archive.zip e / home / you / directory_to_zip. não adiciona diretórios vazios ao zip.
#!/bin/bash
archive="archive_name.zip"
directory="dir_to_zip"
#Get list of files in archive
filesinarchive='unzip -l $archive | sed 's/[ ][ ]*/ /g' | grep 2014 | cut -d" " -f 5 | sort'
#Uncomment when debugging
#echo -e "Files in archive:\n$filesinarchive"
#Get list of files in directory..
filesindirectory='find $directory/ -type f | sort'
#Uncomment when debugging
#echo -e "\n\nFiles in Directory:\n$filesindirectory"
#Save the lists to tmp files..
echo "$filesinarchive" > /tmp/fia
echo "$filesindirectory" > /tmp/fid
#Compare file lists and return the files present in archive and NOT present in directory
remove=$(comm -1 -3 /tmp/fid /tmp/fia)
#Uncomment when debugging
#echo -e "\n\n\n Files to be deleted:\n$remove \n\n"
#Now delete these files from zip
for file in $remove
do
zip -d $archive $file
done
#We have deleted files which were not present in the directory, now we need to update our zip:
zip -R -u $archive $filesindirectory
#delete temp files
rm -f /tmp/fia /tmp/fid
Salve o conteúdo acima no arquivo chamado zipsync.sh, dê a ele permissões de execução (chmod + x zipsync) e execute quando estiver no diretório com o arquivo e o diretório para zip.
Você pode modificar o script para que ele possa usar caminhos não relativos e / ou zipar diretórios vazios.
Espero que isso ajude um pouco.