Saya mengumpulkan skrip untuk melakukan beberapa operasi file untuk saya. Saya menggunakan operator kartu liar *
untuk menerapkan fungsi ke semua file jenis, tetapi ada satu hal yang saya tidak dapatkan. Saya bisa unzip
semua file dalam folder seperti ini
unzip "*".zip
Namun, untuk menghapus semua file zip sesudahnya, perlu saya lakukan
rm *.zip
Artinya, tidak ingin tanda kutip. Unzip, di sisi lain, tidak berfungsi jika saya hanya memberikan * (beri saya peringatan bahwa "file tidak cocok").
Mengapa ini berbeda? Bagi saya, ini sepertinya operasi yang sama persis. Atau saya salah menggunakan wild card?
Pengantar kartu liar di Unix tidak benar-benar masuk ke ini, dan saya tidak dapat menemukan apa pun di rm
atau zip
dokumen.
Saya menggunakan terminal pada Mac (Yosemite).
unzip
bisa melakukan ini tanpafor f in *.zip;do...done
lingkaran shell normal . UI baris perintah yang non-unix-like aneh.unzip
berlaku glob untuk isi arsip; Anda tidak bisa mendapatkannya dari bash dengan wildcard. (Anda perlu `` `untuk f inunzip -l archive.zip
; do ... done`)unzip
menerima gumpalan yang cocok dengan dalam satu file zip. Tetapi ini berbeda; Saya sebenarnya mencobaunzip '*.zip'
dalam direktori dengan banyak file zip, dan itu mengekstrak semua file dari semua zip. Seperti yang saya katakan, sangat aneh.tar
tidak memiliki mode operasi seperti itu.Jawaban:
Anda telah menjelaskan situasinya dengan sangat baik. Bagian terakhir dari teka-teki ini adalah yang
unzip
dapat menangani wildcard itu sendiri:http://www.info-zip.org/mans/unzip.html
Dengan mengutip * wildcard, Anda mencegah shell Anda mengembangkannya, sehingga
unzip
melihat wildcard dan berurusan dengan mengembangkannya sesuai dengan logikanya sendiri.rm
, sebaliknya, tidak mendukung wildcard sendiri , jadi mencoba mengutip wildcard akan menginstruksikanrm
untuk mencari tanda bintang literal dalam nama file sebagai gantinya.Alasan yang
unzip *.zip
tidak berfungsi adalah karenaunzip
sintaks tidak memungkinkan untuk banyak file zip; jika ada beberapa parameter, ia mengharapkan yang ke-2 dan selanjutnya menjadi file dalam arsip:sumber
unzip
bahasa sendiri, dalam kasus lain istilah unix umum?for f in *.zip ; do unzip -v "$f" ; done
. dan sebagian besar alasan MENGAPA shell melakukan ekspansi nama file dll itu sendiri adalah sot bahwa setiap program individu tidak harus (yang akan menghasilkan memiliki banyak implementasi ekspansi wildcard yang ditulis secara independen yang berbeda dalam cara yang kecil namun menjengkelkan) .Perbedaan antara kedua perintah tersebut adalah
*
karakter yang dikutip . Jika Anda memanggil perintah di shell dan menggunakan*
karakter untuk argumen, shell itu sendiri akan mengevaluasi argumen. Lihat contoh ini:Sekarang dengan
*
:Shell mengevaluasi wildcard dan membuat perintah sebagai berikut:
Dengan wildcard yang dikutip, ia ditafsirkan sebagai file bernama (secara harfiah)
*.zip
:The
unzip
utilitas tidak bisa disebut dengan beberapa file zip sebagai argumen. Tapi, pengembang memilih cara lain untuk ini. Dari halaman manual:sumber
unzip
memilih untuk memilih rute itu, daripada mengizinkan beberapa file zip sebagai argumen?Perbedaannya adalah pada kasus pertama shell itu sendiri memperluas glob:
sementara dalam kasus kedua aplikasi itu sendiri Melakukan Sesuatu ™ dengan karakter literal itu:
Jika tidak dikutip, shell pertama memperluas glob, dan perintah akan dijalankan dengan apa pun yang glob glob diperluas.
sumber
Perintah akan menerima argumen setelah diproses oleh shell.
Pada pemrosesan pertama, tanda kutip
*
akan diperluas oleh shell (ke daftar file di direktori ini (pwd) yang cocok dengan pola):Akan mencantumkan semua
.zip
file. Tetapi tidakecho "*".zip"
akan .Pada pemrosesan pertama, kutipan
"*"
tidak akan diperluas, itu akan diberikan kepada perintah unzip sebagai parameter (setelah penawaran dihapus). Perintah unzip akan menerima parameter*.zip
:Ini adalah perintah unzip yang memperluas
*
ke daftar file.Menarik juga bahwa kedua perintah ini tidak akan melakukan tindakan final yang sama persis, dan siapa yang memperluas
*
perubahan:Perintah pertama menerima perintah
*.zip
yang diperluas untuk memproses semua file. Perintah keduaunzip
akan menerima daftar semua.zip
file di pwd, yang tidak akan diproses, karena pengembang unzip telah memilih untuk menolak perluasan lebih dari satuzip
file.sumber
Kutipan diperlukan karena cara zip menangani banyak argumen:
rm
: hapus semua file dalam daftar argumenzip
: unzip file dalam argumen pertama. hanya ekstrak file dalam argumen yang tersisa.seperti yang Anda lihat, ia mencoba mencari file2.zip dan file3.zip di dalam file1.zip
untuk memungkinkan Anda mengekstraksi banyak file zip sekaligus, zip mendukung interpretasi glob dengan sendirinya, dengan hasil yang berbeda.
sumber