Cara diam-diam mendapatkan string kosong dari pola gumpalan tanpa kecocokan


24

Katakanlah saya punya folder dengan tiga file:

foo1
foo2
bar

1. Jika saya lari

list_of_files=$(print foo*)
echo $list_of_files

Saya mendapat: foo1 foo2

2. Jika saya lari

list_of_files=$(print bar*)
echo $list_of_files

Saya mendapat: bar

3. Namun, jika saya lari

list_of_files=$(print other*)
echo $list_of_files

Saya mendapatkan: zsh: no matches found: other*(variabelnya $list_of_fileskosong)


Apakah ada cara untuk meminta zsh agar tidak mengeluh jika itu tidak sesuai dengan ekspansi glob?

Tujuan saya adalah menggunakan mekanisme di atas untuk secara diam - diam mengumpulkan daftar file yang cocok dengan pola glob yang diberikan.

Jawaban:


33

Aktifkan null_globopsi untuk pola Anda dengan Nkualifikasi glob.

list_of_files=(*(N))

Jika Anda melakukan ini pada semua pola dalam skrip atau fungsi, aktifkan null_globopsi:

setopt null_glob

Jawaban ini setara dengan bash dan ksh.

Jangan gunakan printatau perintahkan substitusi! Itu menghasilkan string yang terdiri dari nama file dengan spasi di antara mereka, bukan daftar string. (Lihat Apa itu pemisahan kata? Mengapa penting dalam pemrograman shell? )


15

Cara yang lebih baik: for a in *(.N); do ... ; done. Opsi N membuat zsh mengirimkan daftar kosong ke untuk, dan untuk akan diulang nol kali.

Watch out for ls *.foo(.N); ketika ls menerima daftar argumen kosong, itu daftar semua file, bukan tidak ada. Inilah sebabnya saya tidak suka NULL_GLOB (atau setara dengan bash): Ini mengubah semua gumpalan dan dengan mudah memutuskan panggilan ke mis ls.


Senang melihat jawaban Anda di sini @arnt, ini hanya apa yang saya butuhkan.
gtd

Mengapa .di (.N)? Ada jawaban lain (N)dengan sendirinya, apa bedanya?
Michael Dorst

Pertanyaannya adalah tentang file, dan .membatasi glob untuk mencocokkan hanya file.
Arnt

4

Saya pikir Anda mencari NULL_GLOBopsi:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

-1

Coba dengan cara ini:

list_of_files=$(print other*) 2>/dev/null

Ini akan mengarahkan output kesalahan dari stderr ke / dev / null dan tidak akan ditampilkan.


Itu tidak berhasil sama sekali.
Pablo Olmos de Aguilera C.
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.