Remover arquivo único do arquivo zip no Linux

75

Eu tenho um arquivo zip (criado automaticamente em um script com -j -rsinalizadores) e gostaria de remover um único arquivo dele. Eu tentei como documentado.

zip -d "picture_43_9.jpg" gallery.zip

mas eu recebo este erro:

zip warning: picture_43_9.jpg not found or empty   
zip error: Nothing to do! (picture_43_9.jpg)  

De qualquer forma, não é esse arquivo dentro do arquivo e não é vazio:

unzip -l .../gallery.zip | grep -i 43_9.jpg  
1477092  2013-05-22 14:23   picture_43_9.jpg 

Alguma idéia do que estou fazendo de errado?

Alex Flo
fonte

Respostas:

103

Você tem os argumentos trocados. Tente o seguinte:

zip -d gallery.zip "picture_43_9.jpg" 

Na página do manual zip (1) :

-d
--delete
Remova (exclua) entradas de um arquivo zip. Por exemplo:

zip  -d  foo  foo/tom/junk  foo/harry/\*  \*.o

removerá a entrada foo/tom/junk, todos os arquivos que começam com foo/harry/e todos os arquivos que terminam com .o(em qualquer caminho). Observe que a expansão do nome do caminho do shell foi inibida com barras invertidas, para que o zip possa ver os asteriscos, permitindo que o zip corresponda ao conteúdo do arquivo zip em vez do conteúdo do diretório atual. (As barras invertidas não são usadas nas plataformas baseadas no MSDOS.) Também é possível usar aspas para escapar dos asteriscos, como em

zip -d foo foo/tom/junk "foo/harry/*" "*.o"

Não escapar dos asteriscos em um sistema em que o shell expande curingas pode resultar na conversão dos asteriscos em uma lista de arquivos no diretório atual e na lista usada para excluir entradas do arquivo morto.

No MSDOS, -d diferencia maiúsculas de minúsculas quando corresponde aos nomes no arquivo zip . Isso requer que os nomes dos arquivos sejam inseridos em maiúsculas se foram compactados pelo PKZIP em um sistema MSDOS. (Consideramos tornar esse caso sem distinção de maiúsculas e minúsculas em sistemas onde os caminhos não diferenciam maiúsculas de minúsculas, mas é possível que o arquivo seja proveniente de um sistema em que o caso seja importante e o arquivo possa incluir ambos Bare bar como arquivos separados no arquivo.) Mas veja a nova opção - ic para ignorar maiúsculas e minúsculas no arquivo.

jaypal singh
fonte
Você está certo, obrigado, eu fiquei confuso pela linha de comando ajuda de zip zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Alex Flo
@AlexFlo: Você pode ter uma cópia incorreta da página de manual. A cópia citada acima diz “[ zipfile [ arquivo… ]]”, o que significa que você pode ter (a) nenhum argumento de nome de arquivo (embora eu não saiba como isso pode ser válido, exceto quando você está pedindo ajuda) ), (b) apenas um nome de arquivo zip (arquivo morto ) ou (c) um nome de arquivo zip seguido por um ou mais nomes de arquivos comuns. (Estes podem ser os nomes de arquivos reais para ser inserido no arquivo, ou nomes de membros de arquivo para ser manipulado.)
Scott
@AlexFlo - Você pode passar argumentos de nome de arquivo via STDIN e canalizar zip, como indicado na página de manual que você citou. Por exemplo, se você estiver em um diretório que contém file1.txt, file2.txte file3.txt, você pode executar ls -1 | zip -q 'files.zip' -@, o que irá criar o arquivo files.zipcontendo os 3 arquivos que você canalizada para zipcom seus nomes intactos.
rubynorails