Hindari jalur yang tidak diinginkan dalam file Zip

49

Saya sedang membuat skrip shell untuk mengemas beberapa file. Saya zip direktori seperti ini:

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

Masalahnya adalah bahwa arsip out.zip yang dihasilkan memiliki seluruh path file di dalamnya. Yaitu, ketika membuka ritsleting, itu akan memiliki seluruh jalur "/ Users / me / development / anotherthing /" di dalamnya. Apakah mungkin untuk menghindari jalur yang dalam ini saat meletakkan direktori ke dalam arsip?

Ketika saya menjalankan zip dari dalam direktori target, saya tidak punya masalah ini.

zip -r out.zip ./folder/

Dalam hal ini, saya tidak mendapatkan semua sampah. Namun, skrip yang dimaksud akan dipanggil dari mana saja.

FWIW, saya menggunakan bash di Mac OS X 10.6.

jerwood
sumber

Jawaban:

85

Script Anda harus menggunakan cdatau pushddan popduntuk pindah ke direktori yang akan menjadi root dari arsip sebelum mengeluarkan zipperintah. Bagaimana Anda melakukan ini tepatnya akan tergantung pada bagaimana skrip tahu apa yang harus di-zip. Tetapi, jika Anda ingin / Users / me / development / something / folder di- zip dengan path internal just ./folder , Anda harus melakukan ini:

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

Itu akan menghasilkan out.zip Anda berisi jalur relatif yang Anda inginkan.

Jika Anda membutuhkan bantuan untuk skrip itu, Anda harus menunjukkan kepada kami skrip Anda.

quack quixote
sumber
8
tidak masalah. saya melakukan ini dalam satu baris pada commandline sepanjang waktu, misalnya: $ pushd /some/path ; do-something ; popd... atau bahkan dengan subkulit:$ ( cd /some/path ; do-something )
quack quixote
1
@ ~ quack: +1 terutama untuk teknik sub-shell di komentar.
Jonathan Leffler
1
Meskipun menggunakan &&bukan ;merupakan ide yang baik sehingga perintah lain tidak berjalan jika cdgagal (salah ketik, atau masalah lainnya):(cd /some/path && do-something)
Chris Johnsen
3
Apakah tidak ada cara untuk melakukan ini tanpa menentukan jalur absolut untuk file zip?
orange80
2
Kenapa kamu bermain game dengan sang path? Kenapa tidak digunakan zip -j?
jww
5

Masalahnya adalah bahwa arsip out.zip yang dihasilkan memiliki seluruh path file di dalamnya.
...
Apakah mungkin untuk menghindari jalur yang dalam ini saat meletakkan direktori ke dalam arsip?

Iya nih. Gunakan -jopsi dengan zip. -jadalah "junk the path". Menurut halaman manual di zip :

Simpan saja nama file yang disimpan (junk the path), dan jangan menyimpan nama direktori. Secara default, zip akan menyimpan path lengkap (relatif terhadap direktori saat ini).

Menggunakan -jberarti perintah berikut:

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

Akan membuat arsip yang terlihat seperti:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt
jww
sumber
5
Bukankah ini juga membuang semua jalur, bahkan yang ada di direktori 'folder'? Saya pikir OP hanya ingin menyingkirkan jalur di baris perintah.
Peter Jaric
1
Ini mungkin bukan jawaban untuk pertanyaan ini, tetapi itulah yang saya butuhkan.
Aaron McMillin
1
Jawaban ini salah mengasumsikan bahwa pengguna menginginkan zip datar. Ini adalah asumsi yang buruk dan dapat menyebabkan skrip gagal jika dua file di sub-folder berbeda memiliki nama yang sama.
Andrew Schwartz
1

Ada pushddan popddan $OLDPWD. Dengan asumsi $PWDis /Users/me/developmentdo:

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

Sekarang $PWDkembali ke/Users/me/development

Borodark
sumber