Serinin ilk uygulaması olarak dosya kontrol sistemi gibi bir şey yapmıştık. Bu uygulamada dosyanın veya klasörün var olup olmadığını kontrol ettik, mevcut olması ve olmaması durumunda bazı işlemler yaptık. Kendisine şuradan ulaşabilirsiniz: Uygulama
Biraz önce bahsettiğim uygulamada ne bir döngü ne de bir fonksiyon vardı; o ana kadar edindiğimiz bilgilerle basit bir şey yapmıştık. Şimdi, aynı uygulamayı daha kapsamlı bir şekle sokmanın vakti geldi. Bunun için ilk önce ne yapmamız gerektiğini güzelce anlamamız gerekiyor.
Şimdi biz, hem dosya hem de klasör kontrolü yapacağız. Dolayısıyla ilk önce bu seçenekleri sunmamız ve seçeneklere özel komutlar vermemiz lazım. Bunun için aslında select döngüsü uygun olabilir.
select operations in "Control a file" "Control a directory"
tarzında bir döngü açabiliriz diye düşünüyorum. Yapalım.

Ancak her şeyden önce 'Shebang' ifademizi koyalım ve bu kodların ne işe yaradığını bir yorum satırıyla belirtelim.
Şimdi, "Eğer 'file' seçeneğini seçerse..." gibisinden komutlar vermemiz lazım ama her şeyden önce ana klasöre inmek zorundayız. Çünkü birazdan aradığı dosya veya klasörün yerini ve ismini alacağız ve bir lokasyona gitmemiz gerekecek.

İlk komutumuz 'cd' oldu. Daha sonra iki köşeli parantezli bir if koşulu açıyoruz ve seçeneklerin seçilme durumunu kontrol ediyoruz. Eğer "Control a file" seçeneği seçilirse ne yapabiliriz?

Eğer "Control a file" seçeneği seçilirse ilk önce aradığı dosyayı, nerede aradığını sormamız gerekecektir. Daha sonra 'cd $fileLocation' komutu ile o lokasyona gireceğiz. Son olarak bu dosyanın ismini alacağız ve çeşitli işlemler yapabileceğiz. Bu kısmı, şimdilik bu şekilde bırakalım ve diğer seçeneğimizi değerlendirelim.
Aslında şimdilik, ikinci olasılık olan "Control a directory" seçeneği için de aynı şeyleri yapabiliriz. Çünkü henüz işin başındayız. Bu noktada son olarak; kullanıcı, listede olmayan bir şeyi seçmek isterse onu else ile uyarıyoruz.

Peki, bu noktada kullanıcı eğer "Control a file" seçeneğini seçerse bizim ne yapmamız gerekir? Sanırım ilk önce aranan dosyanın var olup olmadığını kontrol etmemiz daha doğru olur, öyle değil mi? O zaman bunu yapalım ancak bir fonksiyon içerisinde yapalım; burası karışmasın.
Bunun için 'isFileExists' (dosya mevcut mu?) isimli bir fonksiyon açabiliriz.

Fonksiyonu açtıktan sonra direkt olarak dosyanın var olup olmadığını sorguladık ve eğer mevcutsa kullanıcıyı bilgilendirdik. Ancak bir sorun var: hangi $fileName yani hangi dosyayı sorguluyoruz ki? Biraz önce açtığımız select döngüsünü hatırlayın; orada kullanıcıya hem dosya ismi hem de lokasyon soruyorduk. O zaman oraya geri dönüp bu fonksiyonu orada çağırabiliriz, öyle değil mi? select içerisindeki işlemler tamamlandıktan sonra iş, bu fonksiyon ile devam eder. O zaman hadi yapalım.

Yaptık. Burada, yazdığımız bu select döngüsü ilk önce çalışacağı için kullanıcıya dosya ismini ve lokasyonunu soracaktır. Kullanıcı bunları girdiğinde bu döngü, görevini 'isFileExists' isimli fonksiyona devredecektir yani bu dosyanın var olup olmadığı sorgulanacaktır.
Şimdi, fonksiyonumuza geri dönüp ne yapabileceğimize bakalım. Aslında bir dosya eğer mevcutsa onun içerisine bir şeyler yazdırabilir veya dosyayı silebiliriz. Elbette, onu kopyalamak, taşımak gibi işlemleri de yapabiliriz ama bu projede bunlara yer vermedim; siz geliştirebilirsiniz.
Madem öyle; o zaman bir select döngüsü daha açabiliriz. Yapalım.

Bunun için ilk önce; dosya mevcutsa mevcut olduğunu bildiren komuta gidip şunu eklesek güzel olur: "Ne istiyorsun?". Bunu sorduktan sonra select döngüsü ile karşısına seçenekleri çıkarabiliriz.
select içerisinde "Dosyanın içine yaz" ve "Dosyayı sil" şeklinde iki seçenek verdim. Ancak bu seçenekleri yapacak olan işlemleri de birer fonksiyonda tanımlamak istiyorum. O yüzden klasik if koşullarımızı yazdıktan sonra geçici olarak 'break' komutu veriyoruz. Bu işlemlere ait fonksiyonları tanımladıktan sonra bunları düzelteceğiz.
O zaman ilk önce dosyaya yazma görevini yerine getirecek fonksiyonu yazalım.

Bunun için 'writeIntoFile' isimli bir fonksiyon oluşturdum ve içine yazılacak yazıyı istedim. Bununla beraber dosyanın ismini tekrar istedim çünkü bu fonksiyon, klasör için de kullanılacak ve bu, gerekli bir şey. Birazdan göreceksiniz.
Bu noktada dosyanın var olup olmadığını tekrar kontrol etmemize gerek yok ancak ben, dosya mevcut değilse o isimde yeni bir dosyanın oluşturulmasını ve verilen metnin dosyaya yazılmasını istiyorum. Bunun için o dosyanın var olup olmadığını tekrar kontrol edeceğim. Eğer varsa, direkt olarak yazacak ama eğer yoksa yaratıp yazacak.

Az önce dediğim işlemi yaptım. Fonksiyonumuz hazır olduğuna göre bunu, ilk fonksiyonumuz olan 'isFileExists' fonksiyonumuza aktarabiliriz.

Biraz önce 'break' olan komutu silip yerine az önce yazdığımız fonksiyonu koyduk. Burada kullanıcı "Write into the file" seçeneğini seçerse biz, bu işlemi writeIntoFile fonksiyonu aracılığıyla yapacağız.
Evet, çok bağlantı var ancak karışıklığın tek bir noktaya yığılmasını önlüyoruz ve fonksiyonlara verdiğimiz açıklayıcı isimler sayesinde fonksiyonda ne yazdığını bilmeyen biri bile orada neler döneceğini anlayacaktır.
Bunu yaptıktan sonra bir de dosya silme işleminin fonksiyonunu yazalım.

Fonksiyona, 'deleteFile' ismini verdik. Burada kullanıcıya, bunu yapmak isteyip istemediğini; eğer yapmak istiyorsa 'y', istemiyorsa da 'n' tuşuna basmasını istiyoruz. Bu noktada 'if [ $deleteFile == "y" -o $deleteFile == "Y" ]' şeklindeki kod, kafanızı karıştırmasın. Eğer kullanıcının CapsLock tuşu açıksa ve biz sadece küçük y harfini kabul edersek kullanıcı hata alacaktır. Dolayısıyla bu ufak ayrıntıyı kullanıcıya rahatlık sağlasın diye ekledik.
Kullanıcı, dosyayı silmek istediğine eminse dosya ismini alıyoruz ve 'rm -rf $fileName' şeklinde verdiğimiz komut ile bunu gerçekleştiriyoruz. Daha sonra 'Done.' şeklinde kullanıcıyı, işlemin tamamlandığına dair bilgilendiriyoruz. elif ve else kısmı ise bildiğiniz şeyler.
Dosya silme fonksiyonumuz da hazır olduğuna göre bunu, isFileExists isimli fonksiyonumuza aktarabiliriz.

Bu şekilde, işlemimizi tamamladık. Ancak burada ufak bir detay daha var. Burada biz, dosyanın var olup olmadığını sorguluyoruz ve var olması durumunda çeşitli işlemler yapıyoruz. Peki, dosya yoksa? Anlayacağınız üzere isFileExists isimli fonksiyona bir adet 'else' bloğu açmamız gerekiyor ve bu, dosyanın var olmadığı durum için geçerli olacak.
Ondan önce düşünelim. Dosya yoksa, ne yapabiliriz? Yeni bir dosya oluşturabiliriz. Aklınıza, writeIntoFile isimli fonksiyon gelebilir çünkü orada da dosya oluşturuyorduk ancak biz o dosyayı, içine yazmak için oluşturuyoruz; fonksiyonun görevi o. Dolayısıyla sadece dosya oluşturmaya odaklanan, createNewFile isimli bir fonksiyon açabiliriz.

Fonksiyonu açtık ve "Dosya mevcut değil. Yenisini oluşturmak istiyor musun?" tarzında bir soru sorduk. Neden böyle başladık peki? Çünkü bu fonksiyon, isFileExists isimli fonksiyona dahil edilecek ve o fonksiyon, dosyanın var olmadığı durumda bu fonksiyonu kullanacak. Yani dosyanın zaten var olmadığı biliniyor.
Bunu sorduktan sonra biraz önceki gibi if koşullarımızı açabiliriz.

Eğer kullanıcı, oluşturmak istiyorsa touch komutu ile bunu yapıyoruz. Peki, hemen elif - else kısmına geçmeden önce "içine yazmak istiyor musun?" tarzında bir soru sorsak ve bu soruya 'y' cevabı verilmesi durumunda writeIntoFile fonksiyonunu çağırsak nasıl olur? Bence güzel olur. Yapalım.

Kırmızı kutuda gördüğünüz gibi; "içine yazalım mı?" şeklindeki soruya 'y' yanıtı verilirse writeIntoFile isimli fonksiyon devreye girecek. Burada, geri kalan elif - else komutlarını anlatmıyorum; bildiğiniz şeyler. Yalnızca girintilere dikkat edin.
Yeni dosya oluşturan fonksiyonumuz da hazır olduğuna göre isFileExists isimli fonksiyona geri dönüp else kısmına bu fonksiyonu koyabiliriz.

Burada eğer dosya mevcut değilse createNewFile isimli fonksiyon devreye girecek ve gerekli işlemleri yapacak. Burada dikkat etmeniz gereken şey girintilerdir.
Dosya işlemlerini bitirdik gibi görünüyor. Şimdi, klasör işlemlerine bir bakalım. Sonuç olarak projenin başında select döngüsü ile "Dosya işlemleri" ve "Klasör işlemleri" adında iki seçenek sunduk. Birincisi tamam, sıra ikincisinde.

Bu sefer, 'isDirExists' isimli bir fonksiyon açtık ve aranan klasörün var olup olmadığını sorgulayacak if koşulunu yazdık. Ancak dikkat edin, '-d' parametresini verdim; daha önce anlatmıştım.
Eğer klasör mevcutsa "Mevcut" şeklinde bir bilgilendirme mesajı verdik ve ardından bir select döngüsü açtık. Döngü içerisindeki seçenekler; "Klasörü sil", "Klasör içerisine yeni bir dosya oluştur" ve "Klasör içinde bir dosya varsa o dosyaya bir şeyler yaz" şeklinde.
Dosya işlemlerinde olduğu gibi şimdi, bu seçenekler için uygun işi yapacak fonksiyonları yazacağız. Ancak şimdi, fonksiyon yazmanın verdiği güzelliklerden birine şahit olacaksınız. Aşağıdaki görselde ilk önce yeşil kutulara bakmanızı istiyorum.

Yeni dosya oluşturma ("Create file into the directory") ve dosyanın içine yazma ("Write into the exists file") fonksiyonlarımız zaten vardı. Bu sayede hiç yorulmadan direkt olarak o fonksiyonları çağırabiliriz. Fakat ondan önce klasörün içine girmemiz lazım. Dolayısıyla 'cd $dirName' şeklinde bir komut veriyoruz, ondan sonra fonksiyonları çağırıyoruz.
Bu arada bu $dirName nereden geldi diye sorabilirsiniz çünkü fonksiyon içinde öyle bir değişken yok. Bu, projenin başında select döngüsünde belirlediğimiz değişkendi; hatırlayın. Aynı şey, $fileName için de geçerli.
Şimdi, kırmızı kutulara bakalım. Oradaki 'break' komutları, geçici olarak duruyor çünkü henüz o seçeneklerin fonksiyonlarını yazmadık. Yazdıktan sonra onları silip fonksiyon isimlerini koyacağız. İlk önce klasör silmek için bir fonksiyon yazalım.
Bunun için 'deleteDir' isimli bir fonksiyon açıyorum.

Fonksiyonumuz hazır. Burada kullanıcıya klasörü silmek isteyip istemediğini sorduk ve cevabın 'y' olması durumunda ilk önce ana dizine indik ve verilen lokasyona gittik. Daha sonra o lokasyondaki klasörü rm -rf ile sildik. Burada, neden 'rmdir' komutunu kullanmadığımı sorgulayabilirsiniz. 'rmdir', boş klasörler için geçerli bir komuttur ancak biz klasörün boş olup olmadığını sorgulamak istemiyoruz; direkt olarak, ne varsa siliyoruz.
Geri kalan elif ve else kısımlarında bildiğiniz şeyleri yazdım. Şimdi, isDirExists isimli fonksiyondan break komutunu kaldırıp yerine bu fonksiyonumuzu yerleştirelim.

Bu işimizi bitirdik. Şimdi, en aşağıdaki break komutunu kaldırmamız lazım. O kısmın, klasörün var olmadığı olasılık için geçerli olduğunu biliyorsunuz. O zaman klasör mevcut değilse biz de yenisini oluşturan bir fonksiyon yazarız; createNewFile gibi, createNewDir şeklinde bir fonksiyon açabiliriz.

Bu fonksiyonda da her zamanki sorumuzu soruyoruz ve cevap eğer 'y' ise mkdir komutuyla bu klasörü oluşturuyoruz. Şimdi, bu klasörü de isDirExists içerisine koyalım.

Bu durumda eğer klasör mevcut değilse yeni klasör oluşturmak adına createNewDir isimli fonksiyona başvurulacaktır. Ufak bir detay daha var; select döngüsüne dönmemiz ve isFileExists fonksiyonu gibi isDirExists isimli fonksiyonu oraya koymamız lazım.

Kod, buradan başlayacak ve kullanıcıya, ilk önce bu seçim sunulacaktır. Daha sonra bağlantılar sayesinde işlemler kolayca gerçekleştirilecektir. Şimdi, kodumuzu deneyelim.

Gördüğünüz gibi bizi karşılayan ilk şey, ilk tanımladığımız select döngüsü oldu.
Burada ilk önce birinci seçeneği seçelim daha sonra diğerine geçeriz. O yüzden '1' diyorum.

Birinci seçeneği seçtikten sonra bana dosyanın lokasyonunu soruyor; Desktop dedim. Hemen sonrasında dosyanın adını soruyor; deneme.txt dedim. Daha sonra Bash, Desktop içerisinde böyle bir dosyanın var olup olmadığına bakıyor; daha önce öyle bir dosya oluşturduğum için 'Mevcut. Ne istiyorsun?' diyerek select sayesinde iki adet seçenek sunuyor. Burada ya dosyanın içine yazacağım ya da onu sileceğim.
İlk önce silmeyi deneyelim.

İkinci seçeneği seçtikten sonra tekrar soruyor: "Silmek istiyor musun?". Ben de buna 'y' olarak karşılık verdim ve kendisi bana 'Done.' dedi. Sol tarafta biraz önce var olan deneme.txt isimli dosya artık yok.
Şimdi, bu dosyayı tekrar oluşturup ilk seçeneği deneyelim.

Bu sefer yine aynı aşamaya geldim ama ilk seçeneği seçtim ve bana 'Your text: ' şeklinde bir şeyler yazmamı istedi. 'Cyber Worm deneme yazısı' şeklinde bir girdi verdim ve bana 'Done' dedi. Dosyayı kontrol ettiğimde ise gerçekten de yazdığını görüyorum.
Bu sefer, gerçekten var olmayan bir dosya için deneyelim ve neler olacağına bakalım.

Yine aynı işlemleri yaptım ama bu sefer "File's name: " kısmına 'yok' şeklinde bir şey yazdım. 'yok' adında bir dosyam gerçekten de yok. Çıktıya baktığınızda ise 'Böyle bir dosya yok. Oluşturmak ister misin (y/n)?' şeklinde bir soru geldi. Buna 'y' dediğimde sol üst köşede gördüğünüz gibi dosyamı oluşturdu.
Hemen arkasından, 'Dosya oluşturuldu. İçine bir şeyler yazmak ister misin?' şeklinde bir soru soruyor. Buna 'y' diyelim.

'y' dedikten sonra yine 'Your text: ' şeklinde bir girdi beklemeye başladı ve oraya bir şeyler yazdığımda yazdığım şeyi gerçekten de dosyaya aktardığını görüyorum.
Şimdi, ikinci seçeneğe yani klasör işlemlerine bakalım.

Sol tarafta 'deneme' isminde bir klasörüm olduğunu görüyorsunuz. Programı başlattım ve ikinci seçeneği seçtim. Bunu yaptıktan sonra klasörün yerini sordu; Desktop dedim. Sonrasında adını sordu; deneme dedim ve "deneme is exists." şeklinde bir çıktı aldım. Bu klasörün var olduğunu gördüğünde karşıma üç seçenek çıkardı; silmek, içine bir dosya oluşturmak ve içinde var olan bir dosyaya bir şeyler yazmak.
Önce ikinci seçeneği seçelim.

'2' dedikten sonra bana, aradığım dosyanın adını sordu; yeni.txt dedim. Daha sonra böyle bir dosyanın olmadığını söyledi ve bana oluşturmak isteyip istemediğimi sordu. 'y' dedikten sonra "Oluşturuldu. İçine bir şeyler yazmak ister misin?" diye bir soru yöneltti.
Buna da 'y' diyelim.

Sonrasında bizden yine girdi bekledi ve işlemleri tamamladı.
Şimdi, üçüncü seçeneği deneyelim.

Var olan bir dosya ismi verdim ve işlemlerimi gerçekleştirdi. Şimdi, bu klasörü silelim ve bitirelim.

Sol tarafa baktığınızda deneme adında bir klasörün olmadığını görüyorsunuz. Kodumuz başarılı bir şekilde çalışmıştır.
Eğer bu kodu ödeviniz için veya GitHub hesabınıza koymak için alacaksanız lütfen kaynak bildirin. Bununla beraber anlamadığınız bir nokta olduysa lütfen iletişime geçin. Sevgiler.








Yayınlanma Tarihi: 2022-09-21 18:20:40
Son Düzenleme Tarihi: 2022-09-25 12:50:44