Zip dosyasında istenmeyen yollardan kaçının


49

Bazı dosyaları paketlemek için bir kabuk betiği yapıyorum. Böyle bir dizini sıkıştırıyorum:

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

Sorun, sonuçta ortaya çıkan out.zip arşivinin içindeki tüm dosya yoluna sahip olmasıdır. Yani, açıldığında, içinde "/ Kullanıcılar / ben / gelişme / başka bir şey /" yolu bulunacaktır. Bir dizini arşive koyarken bu derin yollardan kaçınmak mümkün müdür?

Hedef dizinin içinden zip'i çalıştırdığımda, bu sorunu yaşamıyorum.

zip -r out.zip ./folder/

Bu durumda, tüm çöpleri anlamıyorum. Ancak, söz konusu senaryo her yerden çağrılacaktır.

FWIW, Mac OS X 10.6'da bash kullanıyorum.

Yanıtlar:


85

Komut dosyanızın , komutu vermeden önce arşivin kökü olacak dizine geçmek için cdveya pushdve kullanması gerekir . Bunu tam olarak nasıl yapacağınız, betiğin neyin sıkıştırılacağını nasıl bildiğine bağlı olacaktır. Ancak, / Kullanıcılar / ben / geliştirme / bir şey / klasörü sadece ./folder'ın iç yolları ile sıkıştırılmış olarak istiyorsanız, bunu yapmanız gerekir:popdzip

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

Bu, istediğiniz göreceli yolları içeren out.zip dosyanızla sonuçlanacaktır .

Bu komut dosyası için yardıma ihtiyacınız olursa, komut dosyanızı bize göstermeniz gerekir.


8
sorun değil. Bunu her zaman komut satırındaki tek gömleklerde yapıyorum, örneğin: $ pushd /some/path ; do-something ; popd... veya hatta alt kabuklarla:$ ( cd /some/path ; do-something )
quixote

1
@ ~ quack: Özellikle yorumdaki alt kabuk tekniği için +1.
Jonathan Leffler

1
Kullanarak olsa &&yerine ;diğer komut çalışmaz böylece iyi bir fikir olup olmadığını cdbaşarısız (yazım hatası veya başka sorun):(cd /some/path && do-something)
Chris Johnsen

3
Zip dosyası için mutlak yolu belirtmeden bunu yapmanın bir yolu yok mu?
orange80

2
Neden yolu ile oyun oynuyorsun? Neden kullanmaz zip -j?
04:15 de

5

Sorun, ortaya çıkan out.zip arşivinin içindeki tüm dosya yoluna sahip olmasıdır.
...
Bir dizini arşive koyarken bu derin yollardan kaçınmak mümkün müdür?

Evet. -jSeçeneğini ile kullanın zip. -j"yolun hurdası" dır. Zip sayfasındaki man sayfasına göre :

Yalnızca kaydedilmiş bir dosyanın adını saklayın (yolu gereksiz) ve dizin adlarını saklamayın. Varsayılan olarak, zip tam yolu depolar (geçerli dizine göre).

Kullanma -jaşağıdaki komutu ifade eder:

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

Şuna benzeyen bir arşiv oluşturacak:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt

5
Bu, aynı zamanda 'klasör' dizinindeki tüm yollarda bile önemsiz değil mi? Bence OP sadece komut satırındaki yoldan kurtulmak istiyor.
Peter Jaric

1
Bu, bu sorunun cevabı olmayabilir, ancak ihtiyacım olan şey bu.
Aaron McMillin

1
Bu cevap yanlış kullanıcının düz bir zip istediğini varsayar. Bu kötü bir varsayımdır ve farklı alt klasörlerdeki iki dosya aynı ada sahipse komut dosyasının başarısız olmasına neden olabilir.
Andrew Schwartz

1

Orada pushdve popdve $OLDPWD. Varsayarsak $PWDedilir /Users/me/developmentyapın:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

Şimdi $PWDgeri döndü/Users/me/development

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.