Bir işleve yapılan her argüman bir skalerdir ve siz bir dizi iletmeye çalışıyorsunuzdur. Yazarken
a=(foo bar qux)
moveFaster "$src" "$dst" "${a[@]}"
: o zaman moveFaster beş argüman alıp $src
, $dst
, foo
, bar
ve qux
. Eğer yazarsanız, moveFaster "$src" "$dst" "$a"
sadece dizinin ilk elemanı işleve iletilir, çünkü $a
kendi başına dizinin ilk elemanına genişler. Ayrıca, typ
onu bir skaler değişken yapar.
Tek bir diziyi işleve geçirdiğiniz için, kalan tüm parametrelerden oluştuğunu beyan edebilirsiniz.
moveFaster () {
src="$1"
dst="$2"
shift 2
typ=("$@")
…
}
İlgili bir notta, söz konusu dosya adlarından herhangi biri beyaz boşluk veya genel karakter ( ?*\[
) içeriyorsa, komut dosyanız olağanüstü başarısız olur . Bundan kaçınmak için, bu basit kabuk programlama kuralına uyun: değişken sübstitüsyonların etrafına her zaman çift tırnak işareti koyun (belirli bir durumda neden olmaması gerektiğini anlamadığınız sürece).
function moveFaster(){
src="$1"
dst="$2"
typ=("$@")
if [ ! -d "$dst" ]; then mkdir -- "$dst"; fi
for i in "${typ[@]}"; do
find "$src" -name "${i}" -exec mv {} "${dst}" \;
done
}
Bir kenara bırakırsanız, bash sürüm 4 veya daha üstü varsa, bunu yalnızca bash özellikleriyle kolayca kolayca yapabilirsiniz. Bu extglob
seçenek gibi uzatılmış küre desenlerine izin verir @(PATTERN1|PATTERN2)
. Bu globstar
seçenek **/PATTERN
, adı PATTERN
alt dizinlerde yinelenen bir şekilde eşleşen dosyaları eşleştirmeye izin verir .
shopt -s extglob globstar
mkdir -p /common/destination/directory
mv /path/to/source/**/@(*.txt|*.html|README) /common/destination/directory