Bölüm 9. Kabuk programlama ilgili soru ve yanıtları içerir

9.1. Diskimde ne kadar yer kaldığını nasıl öğrenebilirim?

df komutunu kullanabilirsiniz. df -h ile daha okunabilir bir sonuç elde etmeniz mümkün.

9.2. Diskimde çok yer kaplayan dosyaları nasıl görebilirim? Diskim doldu.

cd /dizin_ismi/
du -sk *
# Kontrol etmek istediğiniz dizinler için tekrarlayınız.

veya;

find /dizin_ismi/ -size +2000k -ls
# /dizin_ismi/ ile belirtilen dizinde 2000 kilobytes'ın üzerindeki dosyaları listeler

.deb dosyalarını bu işlemin dışında tutmak isterseniz;

find / -size +2000k -ls | awk ' substr($NF, length($NF) - 3, 4) != ".deb" '
# /dizin_ismi/ ile belirtilen dizinde 2000 kilobytes'ın üzerindeki .deb harici dosyaları listeler

Şayet dosya yerine çok yer kaplayan dizinleri listelemek isterseniz;

du -x /dizin_ismi/ | sort -n | tail -10
# /dizin_ismi/ ile belirtilen dizinin altında yer alan en fazla yer kaplayan 10 dizini listeler.

9.3. Mp3 ile dolu bir dizinim var. Mp3 isimlerinde yer alan boşluk karekterlerini _ ile nasıl değiştirebilirim?

rename 's/ /_/g' *.mp3

rename, sistem komutu değildir, Perl ile gelir. Sisteminizde Perl zaten yüklenmiş olacağı için sorun çıkarmaz.

9.4. Bu işlemi yinelemeli (recursively) olarak nasıl yapabilirim?

cd /dizin_ismi/
find . -depth -name '* *' -type f -print0 | xargs -r0 rename 's/ /_/g'

9.5. Belli bir dizin içindeki dosya isimlerini yinelemeli (recursively) olarak büyük harften küçükharfe nasıl çevirebilirim?

cd /dizin_ismi/
find . -name '*[A-Z]*' -type f -print0 | xargs -0 rename 'y/A-Z/a-z/'

Dosya isimleri ile birlikte, dizin isimlerinide büyük harften küçük harfe çevirmek isterseniz.

cd /somewhere
find . -type d -depth -name '*[A-Z]*' -print |
  while read dir; do dname="$(dirname $dir)"; bname="$(basename $dir)";
  newbname="$(echo $bname | tr [:upper:] [:lower:])"; mv "$dir" "$dname/$newbname"; done
# Dizin isimlerini değiştirir.
# A to a until we've already renamed A/B to A/b.
find . -name '*[A-Z]*' -type f -print0 | xargs -0 rename 'y/A-Z/a-z/'

Yukarıdaki betik bazı durumlarda kusurlu sonuçlar verebilir. Dizin isimlerinizin newline, _ veya whitespace karekterine sahip olduğu durumlar için başarısız olur. Betiği kullanma riski tamamıyle size aitdir, dilerseniz kullanmadan önce mv komutunun baş tarafına echo 'yu ekleyerek sonucu görerek değerlendirmeye çalışın.

Buna karşın aşağıdaki basit betik daha kararlı sonuç verebilir.

find /somewhere -depth -name '*[A-Z]*' -print0 | xargs -r0 rename 'y/A-Z/a-z/'

Yine bu betiği sisteminizde uygulamadan önce rename komutunun başına echo'yu ilave ederek sonucu değerlendirmeye çalışınız. Kullanım riski size ait.

9.6. - ile başlayan dosyaları nasıl silebilirim?

unlink -foo

Üç farklı yöntem uygulanabilir;

  • rm -- -foo
  • rm ./-foo
  • 'mc' kullanarak silinebilir. Bunun için dosya ismi üzerinde F8 yapınız.

9.7. Sistemde olup bitenleri anlık olarak nasıl gözlemleyebilirim?

tail -f /var/log/messages

veya

less +F /var/log/messages

veya duruma göre;

watch -n 1 ls -l ~/dizin_ismi/dosya

9.8. Tam yolu ile tanımlanan bir dosyanın sadece ismini nasıl alabilirim?

basename /dosyanın_yolu/dosya_ismi

veya

foo=/dosyanın_yolu/dosya_ismi ; echo ${foo##*/}

9.9. Belli bir dizin içerisinde dosya olup olmadığını nasıl test edebilirim?

if [ "$(ls -A dizin_ismi)" ]; then
    echo "Bu dizin içerisinde dosya var"
fi

Diğer yöntem;

if [ "`ls -A dizin_ismi | wc -l`" -gt 0 ]; then
    echo "dosya bulundu"
fi

veya daha kısa bir yöntem;

[ $(ls -A dizin_ismi) ] && echo "dizin boş değil"

9.10. Bir süreci geri planda nasıl çalıştırabilirim?

Komutun sonuna & işareti eklemeniz yeterlidir.

örnek :cp dosya1 dosya2 & dosya1, dosya2 olarak geri planda kopyalanıyor.

Bu işlemi en sona & işareti koymaksızın da yapabilirsiniz.

Bunun için de komut uyguladıktan sonra Ctrl+Z ile işlemi geri plana atıp daha sonra geri planda sürece devam et demelisiniz. Ctrl+Z işlemi sürecin çalışmasına ara verir, fakat tamamen durdurmaz. Sürecin çalışmasını arkaplanda sürdürmek için bg komutunu kullanın.

bg ile geri plana attığınız süreç tekrar işlemeye devam edecektir. Bu komutu tekrar komut satırında çalışacak ve klavyeden bilgi girilecek şekilde terminale bağlamak için fg 'yi kullanabilirsiniz. Bir programı çalıştırmaya başlattıktan sonra tamamen durdurmaya karar vermişseniz klavyeden Control-C tuşlarına basın veya;

killall cp şeklinde tüm cp süreçlerini yok edebilirsiniz. Durdurulup arkaplanda çalışmaya yönlendirilen süreçlere kısaca görev ismi verilir. Tüm görevleri görebilmek için;

jobs yazın. Görevler, birden fazla oldukları zaman sıra numarası ile belirtilirler.

9.11. Bash kabuk programlamasında değişken içerisinde değişken (variable interpolation) nasıl kullanabilirim?

${$var} gibi birşeye ihtiyacınız varsa, ${!var} biçemini kullanmanız gerekir.

FOO=one
BAR=FOO

şeklindeki tanımlamadan sonra ${!BAR} size 'one' değerini döndürecektir.