Glob kalıbını genişletmenin en iyi yolu?


29

Program biçiminde bir glob desenini (gibi ../smth*/*veya /etc/cron*/) bir dosya listesine genişletmem gerekiyor . Bunu yapmanın en iyi yolu ne olurdu?


2
Özel bir şey yapmanıza gerek yok, sadece alıntı yapmayın *.
Kevin

1
Ayrıştırmaya çalışacak olsanız da, cevabın dediği gibi bir dizi kullanın.
Kevin

Yanıtlar:


40

Dizi bildiriminin sağ tarafında genişlemesine izin verin:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


Kabuk seçeneğinin nullglobayarlanması gerektiğini unutmayın .
Varsayılan olarak ayarlanmamış.
Glob'un (veya birden fazla globdan birinin) herhangi bir adla eşleşmemesi durumunda bir hatayı önler.

Bunu Set bashile

shopt -s nullglob

veya zshile

setopt nullglob

Ve daha sonra bu listeyi nasıl yazdırırım?
Rogach

Bu sadece normal bir dizi. Herhangi bir dizi ile elinizden geleni yapabilirsiniz. Bazı örnekler eklendi.
Manat çalışması

1
Bir sorun var. Desen dosyalarla eşleşmezse, kendisini yazdırır - bu çok iyi değildir.
Rogach

5
Ah, shopt -s nullglob çözdü.
Rogach

1
@lindhe unsetoptve için kullanılan aynı parametre setopt.
Manatwork

0

İşleri fazla karmaşıklaştırmaya gerek yok:

echo your/stuff*

bu işe yaramıyor. Örneğin: TEST=$(echo your/stuff*) && eval \"$TEST\"çıkacak:your/stuff*: No such file or directory
Sebastian

@Sebastian bu bir nullglob sorunudur, yukarıya bakın
Alexei

1
Hayır, bir nulllglob sorunu değil. Scape karakterlerini kullanmak, TESTdeğişkeni, *genişleyen ve genişlemeyen bir dize olarak değerlendirir .
Sebastian,
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.