Unikaj niechcianej ścieżki w pliku Zip

46

Tworzę skrypt powłoki, aby spakować niektóre pliki. Zamykam taki katalog:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

Problem polega na tym, że wynikowe archiwum out.zip zawiera całą ścieżkę do pliku. Oznacza to, że po rozpakowaniu będzie zawierała całą ścieżkę „/ Users / me / development / anotherthing /”. Czy można uniknąć tych głębokich ścieżek podczas umieszczania katalogu w archiwum?

Gdy uruchamiam zip z katalogu docelowego, nie mam tego problemu.

zip -r out.zip ./folder/

W tym przypadku nie dostaję wszystkich śmieci. Jednak dany skrypt zostanie wywołany z dowolnego miejsca.

FWIW, używam basha w systemie Mac OS X 10.6.

jerwood
źródło

Odpowiedzi:

82

Twój skrypt powinien użyć cdlub pushdi popdprzejść do katalogu, który będzie głównym katalogiem archiwum przed wydaniem zippolecenia. To, jak dokładnie to zrobisz, będzie zależało od tego, w jaki sposób skrypt wie, co zrobić. Ale jeśli chcesz / folder / ja / development / coś / folder zapakowany z wewnętrznymi ścieżkami just ./folder , musisz to zrobić:

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

Spowoduje to, że plik out.zip zawiera żądane ścieżki względne.

Jeśli potrzebujesz pomocy w tworzeniu skryptów, musisz pokazać nam swój skrypt.

szarlatanowiec
źródło
8
nie ma problemu. robię to w jednowierszowych wierszach poleceń przez cały czas, np .: $ pushd /some/path ; do-something ; popd... lub nawet z podpowłokami:$ ( cd /some/path ; do-something )
quack quixote
1
@ ~ quack: +1 szczególnie dla techniki pod-powłoki w komentarzu.
Jonathan Leffler
1
Chociaż użycie &&zamiast ;jest dobrym pomysłem, aby inne polecenie nie zostało uruchomione, jeśli błąd cd(literówka lub inny problem):(cd /some/path && do-something)
Chris Johnsen
3
Czy nie ma sposobu, aby to zrobić bez określenia bezwzględnej ścieżki do pliku zip?
orange80
2
Dlaczego grasz w gry ze ścieżką? Dlaczego nie użyć zip -j?
jww
5

Problem polega na tym, że wynikowe archiwum out.zip zawiera całą ścieżkę do pliku.
...
Czy można uniknąć tych głębokich ścieżek podczas umieszczania katalogu w archiwum?

Tak. Użyj -jopcji z zip. -jjest „śmieciowa ścieżka”. Według strony man na zip :

Przechowuj tylko nazwę zapisanego pliku (śmieci) i nie przechowuj nazw katalogów. Domyślnie zip przechowuje pełną ścieżkę (względem bieżącego katalogu).

Użycie -joznacza następujące polecenie:

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

Stworzy archiwum, które wygląda jak:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt
jww
źródło
4
Czy to także nie śmieci wszystkie ścieżki, nawet te w katalogu „folder”? Myślę, że OP chce tylko pozbyć się ścieżki w linii poleceń.
Peter Jaric
1
To może nie być odpowiedź na to pytanie, ale tego właśnie potrzebuję.
Aaron McMillin
Ta odpowiedź błędnie zakłada, że ​​użytkownik chce mieć płaski zamek. Jest to złe założenie i może spowodować niepowodzenie skryptu, jeśli dwa pliki w różnych podfolderach mają tę samą nazwę.
Andrew Schwartz