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.