Entfernen Sie eine einzelne Datei aus dem ZIP-Archiv unter Linux

75

Ich habe ein Zip-Archiv (das automatisch in einem Skript mit -j -rFlags erstellt wird) und möchte eine einzelne Datei daraus entfernen. Ich habe versucht, wie dokumentiert.

zip -d "picture_43_9.jpg" gallery.zip

aber ich bekomme diesen fehler:

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

Wie auch immer, es gibt eine solche Datei im Archiv und sie ist nicht leer:

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

Irgendwelche Ideen, was ich falsch mache?

Alex Flo
quelle

Antworten:

103

Sie haben die Argumente ausgetauscht. Versuche dies:

zip -d gallery.zip "picture_43_9.jpg" 

Aus der Manpage zip (1) :

-d
--delete
Entfernen (Löschen) von Einträgen aus einem ZIP-Archiv. Zum Beispiel:

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

entfernt den Eintrag foo/tom/junk, alle Dateien, die mit beginnen foo/harry/, und alle Dateien, die mit enden .o(in einem beliebigen Pfad). Beachten Sie, dass die Erweiterung des Shell-Pfadnamens durch umgekehrte Schrägstriche verhindert wurde, sodass zip die Sternchen sehen kann, sodass zip mit dem Inhalt des ZIP- Archivs anstelle des Inhalts des aktuellen Verzeichnisses übereinstimmt . (Die Backslashes werden auf MSDOS-basierten Plattformen nicht verwendet.) Kann auch Anführungszeichen verwenden, um die Sternchen wie in zu umgehen

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

Wenn die Sternchen auf einem System, auf dem die Shell Platzhalterzeichen erweitert, nicht ausgeblendet werden, werden die Sternchen möglicherweise in eine Liste von Dateien im aktuellen Verzeichnis konvertiert, und diese Liste wird zum Löschen von Einträgen aus dem Archiv verwendet.

Unter MSDOS unterscheidet -d zwischen Groß- und Kleinschreibung, wenn es mit den Namen im ZIP- Archiv übereinstimmt . Dies erfordert, dass Dateinamen in Großbuchstaben eingegeben werden, wenn sie von PKZIP auf einem MSDOS-System komprimiert wurden. (Wir betrachteten machen diesen Fall unempfindlich auf Systeme , in denen Wege Fall unempfindlich waren, aber es ist möglich , das Archiv kam von einem System , in dem Fall nicht egal und das Archiv kann sowohl umfassen Barund bar als separate Dateien im Archiv.) Aber die neue Option sehen - ic , um Groß- / Kleinschreibung im Archiv zu ignorieren.

Jaypal Singh
quelle
Du hast recht, danke, ich wurde durch die Kommandozeilenhilfe von zip verwirrt zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Alex Flo
@AlexFlo: Möglicherweise haben Sie eine fehlerhafte Kopie der Manpage. Die oben zitierte Kopie lautet „[ zipfile [ file… ]]“, was bedeutet, dass Sie (a) überhaupt keine Dateinamenargumente haben können (obwohl ich nicht weiß, wie das gültig sein kann, außer wenn Sie um Hilfe bitten ), (b) ein Zip - Datei (Archivdatei nur) Name, oder (c) ein Zip - Datei Namen , gefolgt von einem oder mehrere normalen Dateinamen. (Dies können die Namen der tatsächlichen Dateien sein, die in das Archiv eingefügt werden sollen, oder die Namen der Archivmitglieder, die manipuliert werden sollen.)
Scott
@AlexFlo - Sie können Dateinamenargumente über STDIN und Pipe an übergeben zip, wie in der von Ihnen angegebenen Manpage angegeben. Zum Beispiel, wenn Sie in einem Verzeichnis sind enthalten file1.txt, file2.txtund file3.txtkönnen Sie ausführen ls -1 | zip -q 'files.zip' -@, die das Archiv erstellen wird files.zipdie 3 - Dateien enthält , die Sie geleitet zipintakt mit ihren Dateinamen.
Rubynorails