Gokay's Developer Journal

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.
  • while dö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"
  • echo değ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.

Thoughts? Leave a comment