Buat file zip dan abaikan struktur direktori

216

Saya perlu membuat file zip menggunakan perintah ini:

zip /dir/to/file/newZip /data/to/zip/data.txt

Ini berfungsi, tetapi file zip yang dibuat membuat struktur direktori yang meniru direktori ke file mentah. Banyak folder ekstra yang tidak saya butuhkan.

Saya tidak menemukan jawaban sekilas ke halaman manual atau pencarian Google.

Jake
sumber
2
Saya berpikir pertanyaan ini mendahului semua pertukaran stack lain tetapi sayangnya posting superuser sebenarnya lebih tua dari yang ini. Jika ada sesuatu yang bisa saya lakukan di sini untuk membantu memberi tahu saya. Ini pasti jawaban yang cukup panas karena Google masih mengarahkan banyak lalu lintas di sini. : D
Jake

Jawaban:

351

Anda bisa menggunakannya -j.

-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).
Lars Kotthoff
sumber
19
Jika -jtidak berfungsi untuk direktori Anda (bersama-sama dengan -r) checkout jawaban ini
czerasz
kadang-kadang itu tidak berfungsi ... lebih suka tautan @czerasz;) yang pada dasarnya adalah kombo popd
TecHunter
36

Menggunakan -jtidak akan bekerja bersama dengan -ropsi.
Jadi solusi untuknya adalah:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

Atau versi in-line

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

Anda dapat mengarahkan output ke /dev/nulljika Anda tidak ingin cd -output muncul di layar

Vikas Tawniya
sumber
Sebenarnya, Anda mungkin ingin melakukan hal berikut:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23
@ eddyP23 Bagaimana bedanya? Sebaliknya itu akan menyebabkan Anda menambahkan tidak. dari parentDir (..) untuk setiap direktori di jalur: |
Vikas Tawniya
Hasilnya sama, saya setuju. Tetapi dalam skrip otomatis yang berjalan di banyak lingkungan yang berbeda, Anda biasanya menghindari jalur global, karena Anda tidak tahu jalan global apa yang akan terjadi. Tetapi dari cd path/to/parent/dir/Anda dapat menghitung jumlah titik ganda ../dengan mudah.
eddyP23
@ eddyP23 masuk akal
Vikas Tawniya
33

Gunakan -jopsi:

   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).
Dan D.
sumber
18

Agak terkait - Saya sedang mencari solusi untuk melakukan hal yang sama untuk direktori. Sayangnya -jopsi ini tidak berfungsi untuk ini :(

Berikut ini adalah solusi yang bagus untuk menyelesaikannya: /superuser/119649/avoid-unwanted-path-in-zip-file

terkelupas
sumber
3

Atau, Anda dapat membuat tautan simbolis sementara ke file Anda:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

Ini juga berfungsi untuk direktori.

MirkoBanchi
sumber
1

Simpan direktori induk agar unziptidak memuntahkan file di mana-mana

Saat zip direktori, menyimpan direktori induk dalam arsip akan membantu menghindari membuang sampah sembarangan direktori saat ini ketika Anda nanti unzip file arsip

Jadi untuk menghindari mempertahankan semua jalur, dan karena Anda tidak bisa menggunakan -j dan -r bersama-sama (Anda akan mendapatkan kesalahan), Anda bisa melakukan ini sebagai gantinya:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

The ../$(basename $PWD)adalah keajaiban yang mempertahankan direktori induk.

Jadi sekarang unzip my.zipakan memberikan folder yang berisi semua file Anda:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

Alih-alih mengotori direktori saat ini dengan file yang tidak di-zip:

file1
file2
dir1
├── file3
├── file4
AndrewD
sumber
0

Cukup gunakan -jrmopsi untuk menghapus struktur file dan direktori

zip -jrm /path/to/file.zip /path/to/file
Qader Dorosti
sumber
hati-hati, -m --move Pindahkan file yang ditentukan ke dalam arsip zip; sebenarnya, ini menghapus direktori / file target setelah membuat arsip zip yang ditentukan. Jika direktori menjadi kosong setelah penghapusan file, direktori juga dihapus. Tidak ada penghapusan yang dilakukan sampai zip telah membuat arsip tanpa kesalahan. Ini berguna untuk menghemat ruang disk, tetapi berpotensi berbahaya sehingga disarankan untuk menggunakannya bersama -T untuk menguji arsip sebelum menghapus semua file input.
catalint