Usuń pojedynczy plik z archiwum zip w systemie Linux

75

Mam archiwum zip (tworzone automatycznie w skrypcie z -j -rflagami) i chciałbym z niego usunąć pojedynczy plik. Próbowałem zgodnie z dokumentacją.

zip -d "picture_43_9.jpg" gallery.zip

ale pojawia się ten błąd:

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

W każdym razie, nie jest taki plik w archiwum i nie jest pusty:

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

Jakieś pomysły na to, co robię źle?

Alex Flo
źródło

Odpowiedzi:

103

Masz zamianę argumentów. Spróbuj tego:

zip -d gallery.zip "picture_43_9.jpg" 

Ze strony podręcznika zip (1) :

-d
--delete
Usuń (usuń) wpisy z archiwum zip. Na przykład:

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

usunie wpis foo/tom/junk, wszystkie pliki zaczynające się od foo/harry/i wszystkie pliki, które kończą się .o(w dowolnej ścieżce). Zauważ, że rozszerzanie nazw ścieżek powłoki zostało wstrzymane za pomocą ukośników odwrotnych, dzięki czemu zip widzi gwiazdki, umożliwiając dopasowanie zip do zawartości archiwum zip zamiast zawartości bieżącego katalogu. (Ukośniki odwrotne nie są używane na platformach opartych na MSDOS.) Można również użyć cudzysłowów, aby uciec od gwiazdek, jak w

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

Brak znaków gwiazdki w systemie, w którym powłoka rozwija symbole wieloznaczne, może spowodować, że gwiazdki zostaną przekonwertowane na listę plików w bieżącym katalogu i ta lista zostanie użyta do usunięcia wpisów z archiwum.

W MSDOS -d rozróżnia małe i wielkie litery, gdy pasuje do nazw w archiwum zip . Wymaga to, aby nazwy plików były pisane wielkimi literami, jeśli zostały skompresowane przez PKZIP w systemie MSDOS. (Zastanawialiśmy się nad tym, aby wielkość liter nie była rozróżniana w systemach, w których ścieżki nie rozróżniają wielkości liter, ale możliwe jest, że archiwum pochodzi z systemu, w którym wielkość liter ma znaczenie, a archiwum może zawierać zarówno Bari bar jako osobne pliki w archiwum.) Ale zobacz nową opcję - ic, aby zignorować wielkość liter w archiwum.

jaypal singh
źródło
Masz rację, dziękuję, pomyliła mnie pomoc zip-a z linii poleceń zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Alex Flo
@AlexFlo: Możesz mieć złą kopię strony podręcznika. W cytowanej powyżej kopii jest napisane „[ plik zip [ plik… ]]”, co oznacza, że ​​możesz (a) w ogóle nie argumentować nazwy pliku (chociaż nie wiem, jak to może być poprawne, inaczej niż gdy prosisz o pomoc ), (b) tylko nazwa pliku zip (pliku archiwum) lub (c) nazwa pliku zip, po której następuje jedna lub więcej zwykłych nazw plików. (Mogą to być nazwy rzeczywistych plików, które mają zostać wstawione do archiwum, lub nazwy członków archiwum, którymi należy manipulować.)
Scott
@AlexFlo - Możesz przekazywać argumenty nazwy pliku przez STDIN i potok do zip, jak podano na cytowanej stronie podręcznika. Na przykład, jeśli znajdujesz się w katalogu zawierającym file1.txt, file2.txti file3.txt, możesz wykonać ls -1 | zip -q 'files.zip' -@, co spowoduje utworzenie archiwum files.zipzawierającego 3 pliki, do których przesyłałeś potoki zipz nienaruszonymi nazwami plików.
rubynorails