İndirilenler klasörünü bash betiği ile sıralama


1

Mac'imde Downloads klasörünü bash olarak sıralamak için kendi ihtiyaçlarım için senaryo yazıyorum. İşlev parametrelerine geçiyorum: kaynak dizin, hedef dizin ve taşımak istediğim dosya uzantılarının dizisi. Sorun şu ki, işlev "find" satırındayken, bu uzantıya sahip tek bir dosyayı kopyalar, ancak tüm değişkenleri kaldırdığımda ve parametreleri doğrudan koyduğumda düzgün çalışır. Neler oluyor ?

 function moveFaster(){
   clear
    src=$1
    dst=$2
    typ=$3
    if [ ! -d $dst ]
      then
        mkdir $dst
      fi

    for i in "${typ[@]}"
      do
        find $src -name "${i}" -exec mv {} ${dst} \;
      done


  }
bash  shell 

'-X' setini tepeye doğru koyun, böylece yaptığı her şeyi tekrarlar.
Zoredache

Yanıtlar:


5

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, barve qux. Eğer yazarsanız, moveFaster "$src" "$dst" "$a"sadece dizinin ilk elemanı işleve iletilir, çünkü $akendi başına dizinin ilk elemanına genişler. Ayrıca, typonu 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 extglobseçenek gibi uzatılmış küre desenlerine izin verir @(PATTERN1|PATTERN2). Bu globstarseçenek **/PATTERN, adı PATTERNalt 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
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.