Rimuovere il singolo file dall'archivio zip su Linux


75

Ho un archivio zip (creato automaticamente in uno script con -j -rflag) e vorrei rimuovere un singolo file da esso. Ho provato come documentato.

zip -d "picture_43_9.jpg" gallery.zip

ma ottengo questo errore:

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

In ogni caso, non v'è un file all'interno dell'archivio e non è vuoto:

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

Qualche idea su cosa sto facendo di sbagliato?

Risposte:


103

Hai scambiato gli argomenti. Prova questo:

zip -d gallery.zip "picture_43_9.jpg" 

Dalla pagina man zip (1) :

-d
--delete
Rimuovere (eliminare) le voci da un archivio zip. Per esempio:

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

rimuoverà la voce foo/tom/junk, tutti i file che iniziano con foo/harry/e tutti i file che finiscono .o(in qualsiasi percorso). Si noti che l'espansione del percorso della shell è stata inibita con le barre rovesciate, in modo che zip possa vedere gli asterischi, consentendo a zip di corrispondere sul contenuto dell'archivio zip anziché sul contenuto della directory corrente. (Le barre rovesciate non vengono utilizzate su piattaforme basate su MSDOS.) Può anche usare le virgolette per sfuggire agli asterischi come in

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

Non sfuggire agli asterischi su un sistema in cui la shell espande i caratteri jolly potrebbe comportare la conversione degli asterischi in un elenco di file nella directory corrente e tale elenco utilizzato per eliminare le voci dall'archivio.

In MSDOS, -d fa distinzione tra maiuscole e minuscole quando corrisponde ai nomi nell'archivio zip . Ciò richiede che i nomi dei file vengano inseriti in maiuscolo se sono stati compressi da PKZIP su un sistema MSDOS. (Abbiamo considerato di rendere questo caso insensibile ai sistemi in cui i percorsi non facevano distinzione tra maiuscole e minuscole, ma è possibile che l'archivio provenisse da un sistema in cui il caso contasse e che l'archivio potesse includere entrambi Bare bar come file separati nell'archivio.) Ma vedi la nuova opzione - ic per ignorare il caso nell'archivio.


Hai ragione, grazie, sono stato confuso dall'aiuto della riga di comando di zip zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Alex Flo,

@AlexFlo: potresti avere una brutta copia della pagina man. La copia citata sopra dice "[ zipfile [ file ... ]]", il che significa che non puoi avere (a) nessun argomento sul nome del file (anche se non so come possa essere valido, tranne quando chiedi aiuto ), (b) solo un nome di file zip (file di archivio) o (c) un nome di file zip seguito da uno o più nomi di file ordinari. (Questi possono essere i nomi dei file effettivi da inserire nell'archivio o i nomi dei membri dell'archivio da manipolare.)
Scott,

@AlexFlo - Puoi passare gli argomenti del nome file tramite STDIN e pipe a zip, come indicato nella pagina man che hai citato. Ad esempio, se ci si trova in una directory contenente file1.txt, file2.txte file3.txt, è possibile eseguire ls -1 | zip -q 'files.zip' -@, che creerà l'archivio files.zipcontenente i 3 file a cui è stato eseguito il piping zipcon i loro nomi di file intatti.
rubynorails,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.