Bash ile Dosya İsimlerini Otomatik Normalize Etme
Bash ile Dosya İsimlerini Otomatik Normalize Etme
Projelerde, depo yapılarında veya kişisel çalışma dizinlerinde zamanla tutarsız dosya adları birikmesi kaçınılmazdır. Büyük ve küçük harf uyumsuzlukları, boşluklu veya alt çizgili dosya adları, Türkçe karakterler ya da sistemler arası taşınabilirliği bozan isimler; otomasyon süreçlerini, terminal komutlarını ve sürüm kontrol sistemlerini doğrudan etkiler. Bu nedenle dosya isimlerinin standart hâle getirilmesi, özellikle büyük ölçekli projelerde önemli bir ihtiyaçtır.
Bu yazıda, bir dizindeki tüm dosyaları otomatik olarak normalize eden bir Bash script’ini ele alacağız. Script hem güvenli hem de hızlı şekilde çalışacak biçimde tasarlanmıştır. Ayrıca her satırının ne yaptığını ayrıntılı biçimde açıklayarak betiğin mantığını tamamen anlaşılır hâle getirdik.
Amaç
Hazırlanan script’in temel amacı, dizindeki dosya adlarını tutarlı ve taşınabilir bir forma dönüştürmektir. Script şu işlemleri otomatik olarak gerçekleştirir:
- Harfleri küçük harfe çevirir.
- Boşluk ve alt çizgileri kısa çizgiye dönüştürür.
- Türkçe karakterleri ASCII karşılıklarına çevirir.
- Özel karakter bozulmalarını önler.
- Çakışma kontrolü yaparak veri kaybını önler.
- Boşluk içeren dosya adlarında güvenli çalışır.
- Değişiklik gerekmeyen dosyaları otomatik olarak atlar.
Bu sayede tüm dosyalar hem tutarlı hem de komut satırı ve sürüm kontrol sistemleri için ideal bir formata kavuşur.
Script
Aşağıdaki Bash script’i, dizinde bulunan tüm dosya isimlerini normalize edecek şekilde yapılandırılmıştır:
#!/usr/bin/env bash
rg --files | while IFS= read -r file; do
new=$(echo "$file" \
| sed \
-e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' \
-e 's/[ _]/-/g' \
-e 'y/ışğüöç/isguoc/' )
# Değişiklik yoksa atla
if [[ "$file" == "$new" ]]; then
continue
fi
# Çakışma kontrolü
if [[ -e "$new" ]]; then
echo "Hedef dosya zaten mevcut, atlanıyor: $new"
continue
fi
echo "Rename: '$file' -> '$new'"
mv -- "$file" "$new"
done
Satır Satır Açıklama
Aşağıda script’in tüm bileşenleri detaylı şekilde incelenmiştir.
Shebang
#!/usr/bin/env bash
Script’in Bash ile çalıştırılmasını sağlar. /usr/bin/env kullanımı farklı sistemlerde daha yüksek uyumluluk sunar.
Dosyaların listelenmesi ve güvenli okunması
rg --files | while IFS= read -r file; do
rg --files: Dizindeki tüm dosya yollarını listeler.IFS=: Boşluk veya özel karakterlerde bozulmayı önler.read -r file: Satırın ham hâlini alır.whiledöngüsü her dosya için işlemleri çalıştırır.
Dosya adının normalize edilmesi
new=$(echo "$file" \
| sed \
-e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' \
-e 's/[ _]/-/g' \
-e 'y/ışğüöç/isguoc/' )
Bu blok üç dönüşümü tek bir sed zincirinde uygular:
- Tüm harfleri küçük harfe çevirir.
- Boşluk ve alt çizgileri kısa çizgi yapar.
- Türkçe karakterleri ASCII karşılıklarına dönüştürür.
Dönüşüm sonucu new değişkenine yazılır.
Gereksiz işlemlerin atlanması
if [[ "$file" == "$new" ]]; then
continue
fi
Eğer dönüşüm sonucunda dosya adı değişmemişse rename edilmesine gerek yoktur. Script bir sonraki dosyaya geçer.
Çakışma kontrolü
if [[ -e "$new" ]]; then
echo "Hedef dosya zaten mevcut, atlanıyor: $new"
continue
fi
Yeni isim zaten mevcutsa:
- Uyarı verilir.
- İşlem güvenli şekilde atlanır.
- Veri kaybı önlenir.
Yeniden adlandırma
echo "Rename: '$file' -> '$new'"
mv -- "$file" "$new"
echodeğişiklikleri kullanıcıya bildirir.mv --: Güvenli rename işlemi yapar.--özellikle-ile başlayan dosya adlarında önemlidir.
Sonuç
Bu script, karmaşık dosya adlarını düzenli ve uyumlu bir standarda dönüştürmek için güçlü bir otomasyon sunar. Büyük projelerde klasör yapılarını sadeleştirmek, arama ve filtrelemeyi kolaylaştırmak, terminal bazlı iş akışlarını hatasız hâle getirmek için pratik bir çözümdür.