Spakuj plik bez dołączania katalogu nadrzędnego

12

Mam folder, który zawiera wiele plików

teczka

  • artifact1.app
  • artifact2.ext2
  • artifact3.ext3
  • ...

Moim celem jest skompresowanie pliku spoza tego folderu (więc bez użycia cdpolecenia) bez uwzględnienia katalogu reż.

zip -r ./folder/artifact.zip ./folder/artifact1.app

To polecenie obejmuje katalog folderu w końcowym pliku zip. Jakieś wskazówki?

Powiązane pytanie: spakuj zawartość folderu bez dołączania samego folderu

Lorenzo B.
źródło
1
Na stronach podręcznika wygląda na to, że -jmiałoby to zastosowanie tylko i to skompresowałoby wszystkie foldery do jednego katalogu na poziomie głównym w ZIP. Nie tego szukasz, prawda?
phyrfox
@phyrfox Może tak. Musisz to zweryfikować. Dzięki.
Lorenzo B

Odpowiedzi:

13

Jeśli chcesz przechowywać wszystkie pliki folderpod ich nazwami bez wskazania katalogu, możesz skorzystać z tej -jopcji.

zip -j folder/artifact.zip folder/artifact1.app folder/artifact2.ext2 folder/artifact3.ext3

lub

zip -j folder/{artifact.zip,artifact1.app,artifact2.ext2,artifact3.ext3}

Jeśli masz pliki w podkatalogach, nie będą one również zawierać żadnego elementu katalogu w archiwum, np. folder/subdir/fooBędą przechowywane w archiwum jako foo.

Ale prawdopodobnie łatwiej byłoby przejść do katalogu. To prawie dokładnie tyle samo pisania co metoda klamry. Jeśli to zrobisz, jeśli dodasz pliki do podkatalogów, będą one miały swoją ścieżkę względną z katalogu, w którym się zmieniłeś, np. folder/subdir/fooZostaną zapisane jako subdir/foo.

(cd folder && zip artifact.zip artifact1.app artifact2.ext2 artifact3.ext3)

Do użytku interaktywnego tracisz w ten sposób ukończenie powłoki, ponieważ powłoka nie zdaje sobie sprawy, że po uruchomieniu zippolecenia będziesz w innym katalogu . Aby temu zaradzić, wydaj cdpolecenie osobno. Aby łatwo wrócić do poprzedniego katalogu, możesz użyć pushdi popd.

pushd folder
zip artifact.zip artifact1.app artifact2.ext2 artifact3.ext3
popd

Jeśli chcesz mieć pełną kontrolę nad ścieżkami przechowywanymi w pliku zip, możesz utworzyć las dowiązań symbolicznych. O ile nie podano inaczej, zipnie przechowuje dowiązań symbolicznych.

Gilles „SO- przestań być zły”
źródło
Nie musisz jawnie wymieniać wszystkich plików w podkatalogu ( folder), możesz po prostu użyć znaku wieloznacznego, tj.zip -j folder/*
Jakub Kukul
Poleganie na rozszerzaniu powłoki oznacza, że ​​pliki kropkowe (np. .profile) Nie zostaną uwzględnione w archiwum. Zamiast tego zmień bieżący katalog roboczy i określ .jako plik do zarchiwizowania:cd folder && zip -r ../folder.zip .
sheldonh