find
Komutu kullanmak burada yararlı olsa da , kabuğun kendisi herhangi bir üçüncü taraf aracı olmadan bu gereksinimi gerçekleştirmek için seçenekler sunar. bash
Kabuk Eğer özyinelemeli yolları altında dosya adları alabilirsiniz kullanarak genişletilmiş glob destek seçeneğini sağladığını istediğiniz uzantılı bir maç.
Genişletilmiş seçenek, aşağıdaki seçenek extglob
kullanılarak ayarlanması gerekir shopt
. Seçenekler -s
destek ile etkinleştirilir ve -u
işaretlendiğinde devre dışı bırakılır . Ek olarak, birkaç seçenek daha kullanabilirsiniz, yani nullglob
eşsiz bir kürenin tamamen süpürüldüğü ve sıfır kelime kümesiyle değiştirildiği. Ve globstar
bu tüm dizinler aracılığıyla geri çekilmeyi sağlar
shopt -s extglob nullglob globstar
Şimdi yapmanız gereken, aşağıdaki gibi yapabileceğiniz belirli bir uzantının dosyalarını dahil etmek için glob ifadesini oluşturmaktır. Glob sonuçlarını doldurmak için bir dizi kullanıyoruz, çünkü düzgün bir şekilde alıntılandığında ve genişletildiğinde, özel karakterlere sahip dosya adları sağlam kalacak ve kabuk tarafından kelime bölünmesi nedeniyle kırılmayacaktı.
Örneğin *.csv
, özyinelemeli yollardaki tüm dosyaları listelemek için
fileList=(**/*.csv)
Bu seçenek **
, alt klasörler aracılığıyla yineleme yapmak ve *.csv
belirtilen uzantıların herhangi bir dosyasını içerecek şekilde glob genişletmesidir. Şimdi gerçek dosyaları yazdırmak için
printf '%s\n' "${fileList[@]}"
Bir dizi kullanmak ve uygun bir alıntı yapmak, kabuk komut dosyalarında kullanıldığında doğru yoldur, ancak etkileşimli kullanım ls
için glob ifadesi ile
ls -1 -- **/*.csv
Bu, çok sayıda dosyayla eşleşecek şekilde çok iyi genişletilebilir (yani, birden fazla uzantıyla biten dosya ( find
komutta birden çok bayrak eklemeye benzer ). Örneğin, uzantılar *.gif
gibi tüm özyinelemeli görüntü dosyalarını almanız gerektiğini düşünün *.png
ve *.jpg
yapmanız gereken tek şey
ls -1 -- **/+(*.jpg|*.gif|*.png)
Bu da olumsuz sonuçlara ulaşacak şekilde genişletilebilir. Aynı sözdizimiyle, glob'un sonuçları belirli türdeki dosyaları hariç tutmak için kullanılabilir. Yukarıdaki uzantılara sahip dosya adlarını hariç tutmak istediğinizi varsayalım,
excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"
Yapı !()
, içinde listelenen dosya uzantılarının hiçbirini içermeyen bir olumsuz işlemdir ve |
tıpkı glob'ların OR eşleşmesini yapmak için Genişletilmiş Düzenli İfadeler kitaplığında kullanılan bir alternatif operatörüdür.
Bu genişletilmiş glob desteğinin POSIX bourne kabuğunda ve yalnızca son sürümlerine özgü olmadığını unutmayın bash
. Bu nedenle POSIX ve bash
kabuklarda çalışan komut dosyalarının taşınabilirliğini düşünüyorsanız , bu seçenek doğru olmaz.