Eşleşme olmadan bir glob düzeninden boş bir dize sessizce nasıl alınır


24

Diyelim ki üç dosyalı bir klasörüm var:

foo1
foo2
bar

1. Kaçarsam

list_of_files=$(print foo*)
echo $list_of_files

Alırım: foo1 foo2

2. Kaçarsam

list_of_files=$(print bar*)
echo $list_of_files

Alırım: bar

3. Ancak koşarsam

list_of_files=$(print other*)
echo $list_of_files

Anladım: zsh: no matches found: other*(değişken $list_of_filesolsa boş)


Zsh'den glob genişlemesiyle eşleşememesi durumunda şikayet etmemesini istemek için bir yol var mı?

Amacım, belirli bir glob düzeniyle eşleşen dosyaların bir listesini sessizce toplamak için yukarıdaki mekanizmayı kullanmak .

Yanıtlar:


32

Glob niteleyici null_globile modeliniz için seçeneği açın N.

list_of_files=(*(N))

Bunu bir komut dosyasındaki veya işlevdeki tüm kalıplarda yapıyorsanız, null_globseçeneği açın:

setopt null_glob

Bu cevabın bash ve ksh eşdeğerleri vardır.

Değişim kullanmayın printveya komut kullanmayın ! Bu, dize listesi yerine aralarında boşluk bulunan dosya adlarından oluşan bir dize oluşturur. (Bkz. Sözcük bölme nedir? Kabuk programlamada neden önemlidir? )


15

Daha iyi bir yol: for a in *(.N); do ... ; done. N seçeneği, zsh'nin boş bir liste vermesini sağlar ve sıfır kez tekrar eder.

Dikkat et ls *.foo(.N); ls boş bir argüman listesi aldığında, hiçbiri yerine tüm dosyaları listeler. Ben NULL_GLOB (veya bash eşdeğer) sevmiyorum nedeni budur: Bu değişiklikleri tüm örn ls çağrıları kırar kolayca globs ve.


Cevabınızı burada @ görmek @ süslü, bu tam ihtiyacım olan şeydi.
gtd

Neden .içinde (.N)? Diğer cevaplar (N)kendi başlarına, fark nedir?
Michael Dorst,

Soru dosyalarla ilgiliydi ve .dünyayı yalnızca dosyalarla eşleştirecek şekilde kısıtlıyor.
Nisanda

4

Bence NULL_GLOBseçeneği arıyorsun :

   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

Bu yolu dene:

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

Hata çıktısını stderr'den / dev / null dizinine yönlendirir ve göstermez.


Bu hiç işe yaramıyor.
Pablo Olmos de Aguilera C.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.