Bagaimana saya bisa membuat arsip zip seluruh direktori melalui terminal tanpa file tersembunyi?


220

Saya punya proyek dengan banyak folder / file tersembunyi di dalamnya. Saya ingin membuat arsip zip, tetapi di arsip tidak boleh ada folder / file tersembunyi. Jika file dalam folder tersembunyi tidak disembunyikan, mereka juga tidak boleh disertakan.

Saya tahu bahwa saya dapat membuat arsip zip direktori seperti ini:

zip -r zipfile.zip directory

Saya juga tahu bahwa saya dapat mengecualikan file dengan opsi -x, jadi saya pikir ini mungkin berhasil:

zip -r zipfile.zip directory -x .*

Itu tidak berhasil. Semua direktori tersembunyi masih dalam file zip.

Jawaban:


107

Ini juga mengecualikan file tersembunyi di direktori yang tidak diarungi:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@

2
Terima kasih atas jawaban anda. Perintah ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) lebih panjang dari yang diharapkan, tetapi berfungsi dengan baik. Subdirektori juga disertakan, jadi +1 dan jawaban yang diterima :-)
Martin Thoma

105

Pertama-tama jika Anda belum menginstal zip, instal dulu sebagai berikut:

sudo apt-get install zip

Kemudian untuk sekadar membuat file zip:

zip -r compressed_filename.zip foldername

Jika Anda ingin mengecualikan file tersembunyi:

find /folder_path -path '*/.*' -prune -o -type f -print | zip ~/compressed_filename.zip -@

Tidak Termasuk File dari Arsip Zip (diambil dari http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

Dasar-dasar pengecualian file saat membuat arsip zip dipusatkan di sekitar -xbendera, yang digunakan untuk mengecualikan file dari arsip yang cocok dengan nama atau pola tertentu. Pada dasarnya, akan terlihat seperti ini:

zip archive.zip files -x "ExcludeMe"

Berarti Anda dapat mengecualikan satu file, katakan itu bernama "Nothanks.jpg"

zip archive.zip images/ -x "Nothanks.jpg"

Mari kita bahas beberapa contoh spesifik di mana ini berguna.

Kecualikan .DS_Store File dari Arsip Zip

Ini akan mencegah .DS_Store file metadata Mac yang biasanya tidak terlihat dimasukkan dalam arsip zip, yang dibundel secara default:

zip -r archivename.zip archivedirectory -x "*.DS_Store"

Jika direktori menyertakan subdirektori, Anda harus menggunakan variasi lain dari perintah itu untuk mengecualikan file ds_store dari subdirektori juga:

zip -r archive.zip directory -x "*/\.DS_Store"

Catatan: tidak semua shell membutuhkan kutipan agar perintah ini berfungsi dengan baik, tetapi di bash shell (default untuk OS X) Anda harus menggunakan tanda kutip untuk mengecualikan dengan wildcard dan pola.

Kecualikan Jenis File Tertentu dari Arsip Zip

Dengan wildcard, Anda juga dapat mengecualikan semua file dari jenis tertentu dengan memfokuskan pada ekstensi. Sebagai contoh, perintah ini akan mem-zip seluruh direktori, minus semua .jpgfile:

zip -r archive.zip directory -x "*.jpg"

Itu bisa dimodifikasi untuk ekstensi file tertentu atau pola yang cocok dengan nama file.

Kecualikan Direktori .git atau .svn dari Arsip Zip

Zip direktori, minus .gitdan isinya:

zip -r zipdir.zip directorytozip -x "*.git*"

Zip folder, tanpa termasuk .svndirektori:

zip -r zipped.zip directory -x "*.svn*"

Kecualikan Semua File Tersembunyi dari Arsip Zip

Karena pola dan wildcard dapat digunakan, Anda juga dapat mengecualikan semua atau semua file dan folder yang tidak terlihat yang dibuat dengan diawali dengan suatu periode, apakah itu seperti direktori .svnatau file individual seperti .bash_profileatau .htaccess.

zip -r archivename.zip directorytozip -x "*.*"

Atau untuk mengecualikan semua file yang tidak terlihat dari semua subdirektori:

zip -r archive.zip directory -x "*/\.*"

5
Terima kasih atas upaya Anda untuk membantu sesama pengguna Ubuntu. Harap diingat bahwa menyatakan kembali jawaban yang diterima dalam jawaban baru hanya menambah kekacauan dan memiliki kemungkinan besar ditandai untuk dihapus.
hmayag

54

Tambahkan "ke .*(jika tidak, shell Anda meluas .*ke file dot di direktori saat ini), dan juga mengecualikan file tersembunyi di subdirektori:

zip -r zipfile.zip . -x ".*" -x "*/.*"

Ini akan menghasilkan file yang dimulai dengan yang .tidak akan ditambahkan ke file zip Anda.

rinzwind@discworld:~/tmp$ ls -la
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 tmp
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 .tmp
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x .*
adding: .tmp/ (stored 0%)
adding: tmp/ (stored 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
updating: tmp/ (stored 0%)

1
Saya pikir pernyataan terakhir Anda tidak benar. .*akan diperluas oleh shell.
hammar

1
Saya pikir itu mungkin benar tetapi saya menghapusnya (tidak yakin tentang hal itu) :)
Rinzwind

ini tidak berhasil. Direktori .svn ditambahkan
Martin Thoma

1
@moose The mengecualikan pola sesuai dengan path lengkap, bukan hanya nama dasar file, sehingga Anda perlu untuk mengecualikan */.*serta .*( */cocok dengan urutan non-kosong direktori).
Gilles

Ini berjalan tanpa mengubah apa pun! Jawaban Terbaik.
Whitecat

8

Yang ini termasuk semua "." direktori, subdirektori, dan "." file atau direktori di dalam direktori ... Pada dasarnya jawaban pertama tetapi termasuk tingkat atas "." file.

find /full_path -path '*.*/.*' -prune -o -type f -print | zip ~/file.zip -@

8

Contoh untuk mengecualikan semua folder yang dimulai dengan. :

tar cvpzf folder.tgz folder/ --exclude '.*'

Kompres lebih baik tetapi lebih lambat:

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'

5

Metode yang benar adalah:

zip -r zipfile.zip directory -x directory/.*

@ Downvoter: Apa yang salah, ini sepertinya bekerja untuk saya.
jobin

Masalah yang sama dengan jawaban asli Rinzwind (sekarang dikoreksi): Anda tidak termasuk subdirektori. Dan seperti yang dicatat Rinzwind, Anda perlu mengutip wildcard, jika tidak, shell akan mengembang.
Gilles

4

Saat zipping dir, tidak termasuk ekstensi file:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"

3

Tanpa folder dan file tersembunyi di direktori:

zip -r zipfile.zip directory/*

direktori: |── .git │   ├── src │   └── Work.file ├── .test │   └── .file └── test.file

$ zip -r zipfile.zip directory/*
adding: directory/src/ (stored 0%)
adding: directory/src/Work.file (stored 0%)
adding: directory/test.file (stored 0%)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.