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.

Amelio Vazquez-Reina
sumber

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? )

Gilles 'SANGAT berhenti menjadi jahat'
sumber
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.

bukan
sumber
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.
enzotib
sumber
-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.

buru-buru
sumber
Itu tidak berhasil sama sekali.
Pablo Olmos de Aguilera C.