Apakah ada cara untuk zip semua file dalam direktori yang diberikan dengan zip
perintah? Saya pernah mendengar tentang penggunaan *.*
, tetapi saya ingin itu berfungsi untuk file tanpa ekstensi juga.
command-line
wildcards
zip
tkbx
sumber
sumber
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
berarti file apa pun dengan titik. Dalam cp / m dan dos semua file memiliki titik, dan itu membuat Anda mengetiknya (tidak bisa melakukan*
). Karena itu orang-orang datang untuk melihat*.*
semua file. Akhirnya Microsoft menambahkan nama file panjang yang bisa memiliki nol, atau lebih banyak titik. Untuk menemukan file yang memiliki titik pada windows Anda harus mengetik*.*.*
.Jawaban:
Anda bisa menggunakan
*
; tidak perlu untuk*.*
. Ekstensi file tidak spesial di Unix.*
cocok dengan nol atau lebih karakter — termasuk titik. Jadi cocokfoo.png
, karena itu nol atau lebih karakter (tujuh, tepatnya).Perhatikan bahwa
*
secara default tidak cocok dengan file yang dimulai dengan titik (tidak juga*.*
). Ini yang sering Anda inginkan. Jika tidak, dalam bash, jika Andashopt -s dotglob
mau (tapi masih akan mengecualikan.
dan..
). Kerang lain memiliki cara yang berbeda (atau tidak sama sekali) untuk memasukkan dotfile.Atau,
zip
juga memiliki-r
opsi (rekursif) untuk melakukan seluruh pohon direktori sekaligus (dan tidak perlu khawatir tentang masalah dotfile):di mana
mydir
direktori berisi file-file Anda. Perhatikan bahwa zip yang dihasilkan akan berisi struktur direktori serta file. Seperti yang ditunjukkan peterph dalam komentarnya, ini biasanya dilihat sebagai hal yang baik: mengekstrak zip akan menyimpan semua file yang diekstrak dengan rapi dalam satu subdirektori.Anda juga bisa memberi tahu zip untuk tidak menyimpan path dengan opsi
-j
/--junk-paths
.The
zip
perintah dilengkapi dengan dokumentasi bercerita tentang semua nya (banyak) pilihan; ketikman zip
untuk melihat dokumentasi itu. Ini tidak unik untuk di-zip; Anda bisa mendapatkan dokumentasi untuk sebagian besar perintah dengan cara ini.sumber
*
shell-globbing tidak termasuk dotfiles (mis. Nama file dimulai dengan.
). Ini adalah keuntungan lain untuk zip seluruh direktori dengan nama..
dan..
?Dalam kasus saya, saya ingin meng-zip setiap file ke dalam arsipnya sendiri, jadi saya melakukan yang berikut
zsh
:sumber
mkv
disini? Juga tidak ada yang khusus di sinizsh
. Anda ingin mengutip dengan benar variabel apa pun yang berisi nama file, jadizip "${file%.*}.zip" "$file"
dengan tanda kutip ganda di sekitar kedua variabel.mkv
. Kedua, mengutip argumen tidak perlu dalamzsh
, tidak seperti dibash
. Itu sebabnya saya menentukan bahwa ini adalah perintah untukzsh
.find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(dengan-P
penyesuaian tergantung pada utas CPU Anda ...) (Banyak dependensi GNU ...)Cara lain adalah dengan menggunakan find dan xargs: (ini mungkin termasuk direktori "." Di zip, tetapi masih harus diekstrak dengan benar. Dengan pengujian saya, zip melepas titik sebelum kompresi)
find . -type f -exec zip zipfile.zip {} +
(
+
Dapat diganti dengan\;
jika versifind
Anda tidak mendukung+
akhir untuk eksekutif. Akan lebih lambat ...)Ini secara default akan mencakup semua sub-direktori. Pada GNU temukan
-maxdepth
dapat mencegah itu.sumber
*
, ini akan mencakup dotfiles dan tidak akan jatuh jika ada terlalu banyak file dalam direktori)Metode lain (lambat) untuk melakukan ini (yang menambahkan satu file ke zip sekaligus):
Ini memiliki masalah dotfile
*
(solusi ditambahkan) dan akan mulai zip sekali untuk setiap file, menambahkannya ke arsip. Dalambash
, itu akan berurusan dengan sejumlah besar file.Ini akan lebih lambat daripada kebanyakan metode lain, tetapi relatif sederhana.
sumber
for f in *; do zip zip.zip "$f"; done