# Bash ile Dizin İçindeki Tüm Dosyalara Önek Ekleme
Birçok geliştirici ve sistem yöneticisi, dosya isimlerine önek ekleme ihtiyacıyla karşı karşıya kalır. Örneğin, bir yedekleme işlemi sonrası dosyaları tarihle etiketlemek, bir projedeki tüm dosyaları belirli bir kategoriye ayırmak veya bir hata ayıklama işlemi sırasında dosyaları tanımlamak gibi durumlarda bu işlem olmazsa olmazdır. Bu makalede, Bash komut satırı aracı kullanarak bir dizindeki tüm dosyalara önek ekleme işlemini adım adım, yeni başlayanlardan ileri seviye kullanıcılara kadar, farklı seviyelerde ele alacağız. Farklı senaryolar için optimize edilmiş çözümler ve performans analizleri sunacağız.
Öğrenme Yol Haritası
Bu rehber, üç farklı seviyedeki kullanıcı için tasarlanmıştır:
Yeni Başlayan: Temel komutlar ve basit bir uygulama örneği ile başlayacağız.
Orta Seviye: Gerçek dünya senaryoları ve optimizasyon teknikleri ele alınacaktır.
İleri Seviye: Performans analizi, hata yönetimi ve özel durumlar (edge cases) üzerinde durulacaktır.
Bash Temelleri: Dosya ve Dizin İşlemleri
Bash, Linux ve macOS sistemlerinde kullanılan güçlü bir komut satırı yorumlayıcısıdır. Dosya ve dizin işlemleri için birçok kullanışlı komut sunar. Önek ekleme işlemi için temel olarak rename komutu ve wildcards (joker karakterler) kullanacağız. rename komutu, dosya isimlerini belirli bir kalıba göre değiştirmek için kullanılır. Wildcard’lar ise belirli bir kalıba uyan birden fazla dosyayı seçmemizi sağlar. Örneğin, *.txt tüm .txt uzantılı dosyaları temsil eder. rename komutunun farklı versiyonları (Perl rename ve util-linux rename) vardır, bu yüzden kullandığınız sistemdeki versiyonu doğrulamak önemlidir. rename --version komutunu kullanarak versiyon bilgisini alabilirsiniz. Bu bilgi, hangi syntax’ı kullanacağınız konusunda size yol gösterecektir.
Yeni Başlayanlar İçin: Önek Eklemenin Basit Yolu
En basit yöntem, rename komutunu kullanarak dosya isimlerinin başına önek eklemektir. Aşağıdaki komut, mevcut dizindeki tüm .txt dosyalarının başına “backup_” önekini ekler:
rename 's/(.*)/backup_$1/' *.txt
Bu komut, Perl uyumlu rename komutunu kullanır. (.*) tüm dosya adını yakalayan bir regular expression’dır, $1 ise yakalanan bu kısmı temsil eder. s/eski/yeni/ ise “eski” kısmını “yeni” ile değiştirme işlemini yapar. Bu komutun nasıl çalıştığını adım adım inceleyelim:
1. rename: Dosya isimlerini değiştirmek için kullanılan komut.
2. 's/(.*)/backup_$1/': Perl regular expression’ı. Dosya adını yakalayan parantez içindeki ifade $1 değişkenine atanır ve “backup_” önekinden sonra eklenir.
3. *.txt: Tüm .txt uzantılı dosyaları seçen wildcard.
Örnek: Eğer dosya1.txt, dosya2.txt dosyalarınız varsa, komut çalıştıktan sonra backup_dosya1.txt, backup_dosya2.txt dosyalarına dönüşecektir.
Orta Seviye: Gerçek Dünya Senaryoları ve Optimizasyon İpuçları
Şimdi, daha gerçekçi bir senaryoya bakalım. Diyelim ki, /home/kullanici/resimler dizinindeki tüm resimleri (.jpg, .png, .gif) “20241027_” önekini ekleyerek yedeklemek istiyorsunuz. Bu durumda, aşağıdaki komutu kullanabilirsiniz:
rename 's/(.*)/20241027_$1/' /home/kullanici/resimler/*.{jpg,png,gif}
Bu komut, önceki örneğe benzer şekilde çalışır, ancak farklı dosya tiplerini içeren bir wildcard ve farklı bir dizin yolu kullanır. Bu durumda, .jpg, .png ve .gif uzantılı tüm dosyalar işlenir.
Optimizasyon İpuçları:
* find komutu ile birlikte kullanın: Çok büyük dizinlerde rename komutunu doğrudan kullanmak yavaş olabilir. find komutu ile dosyaları filtreleyip, daha sonra xargs ile rename komutuna iletmek daha verimli olabilir:
find /home/kullanici/resimler -name "*.jpg" -o -name "*.png" -o -name "*.gif" -print0 | xargs -0 rename 's/(.*)/20241027_$1/'
Bu komut, find ile belirtilen dosyaları xargs aracılığıyla rename komutuna sıfırla ayrılmış bir liste olarak gönderir. Bu, dosya isimlerinde boşluk veya özel karakterler olsa bile doğru çalışmasını sağlar.
* Kuru Çalıştırma (Dry Run): -n veya --dry-run seçeneğini kullanarak komutun yapacağı değişiklikleri önizleyebilirsiniz. Bu, beklenmedik sonuçlardan kaçınmak için önemlidir. Örneğin:
rename -n 's/(.*)/20241027_$1/' /home/kullanici/resimler/*.{jpg,png,gif}
İleri Seviye: Performans Analizi ve Özel Durumlar (Edge Cases)
Çok büyük dizinlerde işlem yaparken performans kritik hale gelir. time komutu ile komutların çalışma süresini ölçebilirsiniz. Farklı yöntemleri karşılaştırarak en hızlı olanı seçebilirsiniz. Örneğin, find ve xargs kullanımı ile doğrudan rename kullanımını karşılaştırabilirsiniz.
Edge Cases:
* Boşluk İçeren Dosya İsimleri: Boşluk içeren dosya isimleriyle çalışırken, yukarıda gösterildiği gibi find ve xargs kullanımı daha güvenilirdir.
* Özel Karakterler: Özel karakterler içeren dosya isimleri için dikkatli olmak gerekir ve regular expression’ları doğru şekilde yazmak önemlidir. Gerekirse, sed veya awk gibi daha güçlü araçlar kullanılabilir.
* Hata Yönetimi: Komutların başarısız olması durumunda, hata mesajlarını yakalamak ve uygun şekilde işlemek önemlidir. set -e ile komut başarısız olduğunda komut dosyasının durmasını sağlayabilirsiniz.
Performans Optimizasyonu:
Çok büyük dosya sayıları ile çalışırken, parallel processing teknikleri kullanmak performansı önemli ölçüde artırabilir. parallel komutu bu amaçla kullanılabilir. Ancak bu, daha karmaşık komut dizileri gerektirebilir ve dikkatli bir şekilde uygulanmalıdır.
Uygulamalı Kılavuz: Farklı Senaryolar İçin Çözümler
Senaryo 1: Bir web sitesinin tüm HTML dosyalarının başına “v2_” önekini ekleyin:
find . -name "*.html" -print0 | xargs -0 rename 's/(.*)/v2_$1/'
Senaryo 2: Bir fotoğraf koleksiyonundaki tüm JPEG dosyalarının başına tarih ekleyin (bugünün tarihi):
tarih=$(date +%Y%m%d)
find . -name "*.jpg" -print0 | xargs -0 rename 's/(.*)/'$tarih'_$1/'
Senaryo 3: Bir dizindeki tüm dosyaların uzantısını .bak olarak değiştirin:
rename 's/\.([^\.]+)$/.bak/' *
Sonuç
Bash, dosya isimlerine önek eklemek için güçlü ve esnek bir araçtır. Bu makalede, farklı seviyelerdeki kullanıcılar için adım adım bir rehber sunarak, basit uygulamalardan ileri seviye optimizasyon ve hata yönetimine kadar geniş bir yelpazeyi kapsadık. rename, find, ve xargs komutlarının birleşimi, büyük ve karmaşık dosya yapıları ile bile verimli bir şekilde çalışmanıza olanak tanır. Unutmayın ki, her zaman kuru çalıştırma yaparak beklenmedik sonuçlardan kaçınmalısınız. Daha detaylı bilgi için [Fatih Soysal’ın Bash eğitimlerine](https://fatihsoysal.com) göz atabilirsiniz.
Sıkça Sorulan Sorular:
1. rename komutunun farklı versiyonları var mı? Evet, Perl uyumlu rename ve util-linux rename gibi farklı versiyonlar vardır. Kullandığınız versiyona göre syntax değişebilir.
2. Hatalı bir komut çalıştırırsam ne olur? Verilerinizi yedeklemeniz önemlidir. Hatalı bir komut dosya isimlerini bozabilir. -n veya --dry-run seçeneğini kullanarak komutu önizleyin.
3. Çok büyük dizinlerde performansı nasıl artırabilirim? find ve xargs komutlarını birlikte kullanın ve gerektiğinde parallel processing tekniklerini araştırın.
4. Özel karakterler içeren dosya isimleriyle nasıl başa çıkabilirim? Güçlü regular expression’lar kullanın veya sed veya awk gibi araçları tercih edin.
5. Komutların başarısız olması durumunda nasıl hata yönetimi yapabilirim? set -e kullanarak komut başarısız olduğunda komut dosyasının durmasını sağlayabilirsiniz ve hata mesajlarını yakalayarak loglayabilirsiniz.
Yazar: Fatih Soysal
