[ -f /*.txt ]
orada sadece true dönecekti birini (ve tek) olmayan gizli dosyayı /
adlarına uçları içinde .txt
o dosya normal bir dosya veya normal dosyaya bir sembolik bağdır ve eğer.
Bunun nedeni, joker karakterlerin komuta geçilmeden önce kabuk tarafından genişletilmesidir (burada [
).
Orada bir parça varsa /a.txt
ve /b.txt
, [
5 argümanları geçilecek: [
, -f
, /a.txt
, /b.txt
ve ]
. [
daha sonra -f
çok fazla argüman verildiğinden şikayet ederdi .
*.txt
Desenin en az bir gizli olmayan dosyaya genişlediğini kontrol etmek istiyorsanız (normal veya değil):
shopt -s nullglob
set -- *.txt
if [ "$#" -gt 0 ]; then
./script "$@" # call script with that list of files.
fi
# Or with bash arrays so you can keep the arguments:
files=( *.txt )
# apply C-style boolean on member count
(( ${#files[@]} )) && ./script "${files[@]}"
shopt -s nullglob
olduğu bash
belirli fakat kabukları gibi ksh93
, zsh
, yash
, tcsh
eşdeğer ifadeler var.
Dizinin içeriğini okuyarak bu dosyaları bulduğunu, bu dosyalara erişmediğini ve bu dosyalara erişmediğini unutmayın; bu ls
da stat
, kabuk tarafından hesaplanan dosyaların listesi veya benzeri komutları çağıran çözümlerden daha verimli olmasını sağlar .
Standart sh
eşdeğer olacaktır:
set -- [*].txt *.txt
case "$1$2" in
('[*].txt*.txt') ;;
(*) shift; script "$@"
esac
Sorun Bourne veya POSIX mermilerinde, eğer bir kalıp uyuşmuyorsa, kendine yayılıyor. Yani, *.txt
genişlerse , dizinde dosya *.txt
olmadığı için .txt
veya adı verilen bir dosya olduğu için bunun ne olduğunu bilmiyorsunuz *.txt
. Kullanımı [*].txt *.txt
, ikisi arasında ayrım yapılmasını sağlar.
/
? Ayrıca, daha önce bir noktalı virgül eksikfi
.