Linux: Określanie katalogu najwyższego poziomu podczas tworzenia archiwum zip

17

Mam projekt ze zwykłą strukturą katalogów (src /, bin /, ...), tj

project-name/
|-- bin
|-- lib
|-- src
`-- Makefile

I chciałby utworzyć archiwum o następującej strukturze katalogów:

project-name-version/
|-- bin
|-- lib
|-- src
`-- Makefile

Czy istnieje dobry sposób, aby to zrobić, co pozwala uniknąć tworzenia katalogu tymczasowego w project-name/innym miejscu, a następnie kopiowania plików w celu wywołania zip -r ...tego katalogu tymczasowego?

(Zasadniczo szukam jakiegoś rodzaju prefiksu ścieżki lub opcji ścieżki względnej.)

leden
źródło

Odpowiedzi:

9

Może to już ci się przydarzyło, ale dlaczego nie po prostu użyć łącza sym zamiast kopiować wszystko?

ln -s project-name project-name-version

następnie użyj zip -rłącza sym ( zipczy domyślnie dereferencje łączy sym)? Kiedy skończysz, możesz po prostu rmlink do sym. Być może nie jest to najbardziej eleganckie rozwiązanie, ale nie znam oczywistego sposobu, aby to zrobić zipbezpośrednio.

Błąd krytyczny
źródło
1
Działa to również w tarprzypadku korzystania z -hflagi.
Kyle Strand
(Używam również zflagi; nie jestem pewien, czy to na nią wpływa.)
Kyle Strand
15

To jest raczej rada niż odpowiedź: użyj Git !

Jeśli skonfigurujesz repozytorium Git dla swojego projektu, cała sprawa stanie się dość prosta:

git archive HEAD --prefix=project-name-version/ \
    --format=zip -o project-name-version.zip
Cyrus
źródło
1
Doskonała rada, dziękuję. Dokumentacja archiwum git: git-scm.com/docs/git-archive
Meglio
1
Chociaż używanie kontroli wersji jest dobrym pomysłem, ta odpowiedź nie pasuje do pytania dotyczącego ogólnego przypadku.
raimue 20.04.2016
@ Raim „To jest raczej rada niż odpowiedź: użyj Git!” napisane tam od 4 lat, dziękuję za zwrócenie na to uwagi
cYrus 20.04.16
1
Jeśli nie było to zamierzone jako odpowiedź, należy je przekształcić w komentarz.
raimue 20.04.2016
1
@Gregor Myślę, że jest to pożądane zachowanie, ponieważ takie pliki są faktycznie częścią projektu, w każdym razie możesz użyć atrybutów Git, np. Utworzyć plik o nazwie .gitattributeszawierającej .git* export-ignore.
cyr