Zip semua file dalam direktori?

Apakah ada cara untuk zip semua file dalam direktori tertentu dengan zip perintah? I'telah mendengar tentang menggunakan *.*, tapi saya ingin bekerja untuk extensionless file, terlalu.

Mengomentari pertanyaan (4)
Larutan

Anda hanya dapat menggunakan *; tidak perlu untuk *.*. Ekstensi File yang tidak khusus pada Unix. * cocok dengan nol atau lebih karakter—termasuk titik. Sehingga cocok foo.png, karena itu's nol atau lebih karakter (tujuh, tepatnya).

Perhatikan bahwa * secara default doesn't pertandingan file yang diawali dengan titik (juga tidak *.*). Ini adalah sering apa yang anda inginkan. Jika tidak, di bash, jika anda shopt -s dotglob itu akan (tetapi masih akan mengecualikan . dan ..). Kerang lainnya memiliki cara yang berbeda (atau tidak sama sekali) termasuk dotfiles.

Atau, zip juga memiliki -r (rekursif) pilihan untuk melakukan seluruh pohon direktori sekaligus (dan tidak perlu khawatir tentang dotfile masalah):

zip -r myfiles.zip mydir

di mana dirsaya adalah direktori yang berisi file anda. Catatan yang dihasilkan kantong akan berisi struktur direktori serta berkas. Sebagai peterph poin dalam komentarnya, hal ini biasanya dilihat sebagai hal yang baik: pengekstrak zip rapi akan menyimpan semua file diekstrak dalam satu subdirektori.

Anda juga dapat memberitahu zip untuk tidak menyimpan jalur dengan -j/--sampah-jalan pilihan.

The zip perintah dilengkapi dengan dokumentasi yang memberitahu anda tentang semua (banyak) pilihan; tipe pria zip untuk melihat bahwa dokumentasi. Ini isn't unik untuk zip; anda bisa mendapatkan dokumentasi untuk sebagian besar perintah dengan cara ini.

Komentar (16)

Dalam kasus saya saya ingin zip masing-masing file ke arsip, jadi saya lakukan hal berikut (dalam zsh):

$ for file in *; do zip ${file%.*}.zip $file; done
Komentar (3)

Cara lain adalah dengan menggunakan menemukan dan xargs: (ini mungkin termasuk "." direktori di kantong, tapi itu masih harus ekstrak dengan benar. Dengan tes saya, zip dilucuti dot sebelum kompresi) cari . -type f -exec zip zipfile.zip {} +

(The + dapat diganti dengan \; jika versi menemukan tidak mendukung + untuk exec. Itu akan menjadi lebih lambat meskipun...)

Ini akan secara default mencakup semua sub-direktori. Pada GNU menemukan -maxdepth dapat mencegah hal itu.

Komentar (1)

Lain (lambat) metode untuk melakukan hal ini (yang menambahkan satu file zip pada satu waktu):

for f in * .[^.]*; do
    [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
    zip zipfile.zip "$f" # If directories are included, you probably want to add -r
done

Ini memiliki dotfile isu-isu * (solusi ditambahkan) dan akan mulai zip sekali untuk setiap file, menambahkan untuk arsip. Di bash, itu akan berurusan dengan sejumlah besar file.

Itu akan menjadi lebih lambat dari sebagian besar metode lain, tapi ini relatif sederhana.

Komentar (4)