Blog

cd Komutu: Dizinler Arasında Gezinme Teknikleri — Web Sunucusu Yöneticileri İçin Pratik Rehber

Terminal’de her gün onlarca kez kullandığın cd komutu aslında sandığından çok daha güçlü. Web sunucusu yönetiminde zamandan kazandıracak gezinme tekniklerini, kısayolları ve püf noktaları bu yazıda derledim.

Terminali açtığında ilk yaptığın şey nedir? Büyük ihtimalle bir cd yazıyorsun ve bir yerlere gitmeye çalışıyorsun. Yani günde belki yüz kez kullandığın bu komut hakkında ne kadar şey bildiğini hiç düşündün mü? Şimdi düşün: eğer bu komutu yüzde elli daha verimli kullansaydın, yılda ne kadar zaman kazanırdın?

Web sunucusu yöneticisi olarak zamanının büyük bir kısmını terminal’de geçiriyorsun. Apache config dosyaları, Nginx vhost’ları, PHP-FPM havuzları, log dizinleri… Bunlar arasında sürekli gidip geliyorsun. Bu yazıda cd komutunun temellerinden başlayıp, seni gerçekten hızlandıracak ileri tekniklere kadar her şeyi ele alacağım. Hazırsan başlayalım.

cd Komutunun Temelleri — Bildiğini Sandıkların

Evet, cd dizin_adı ile dizine girersin. Bunu zaten biliyorsun. Ama temel kullanımı hızlıca geçelim ki aynı sayfada olalım, ardından asıl güzel kısımlara geçeceğiz.

# Mutlak yol ile dizine git
cd /var/www/html

# Göreli yol ile dizine git
cd html

# Bir üst dizine git
cd ..

# İki üst dizine git
cd ../..

# Home dizinine dön (üç farklı yöntem, hepsi aynı işi yapar)
cd
cd ~
cd $HOME

Bunları biliyorsun, tamam. Şimdi asıl meseleye gelelim.

Web Sunucusu Yöneticisinin Olmazsa Olmazı: Hızlı Dizin Geçişleri

Bir web sunucusunda çalışırken dizin yapısı oldukça derinleşebilir. Örneğin bir müşterinin Apache virtual host konfigürasyonunu düzenleyip ardından log dosyalarına bakmak istediğinde, birkaç farklı dizin arasında sürekli gidip geliyorsun. İşte bu noktada hayatını kolaylaştıracak ilk teknik: tire (-) kısayolu.

# Şu an /var/www/html/musteri1/public_html konumundasın
cd /var/log/apache2

# Düz log dosyalarına baktın, şimdi geri dönmek istiyorsun
cd -
# Çıktı: /var/www/html/musteri1/public_html
# ve otomatik olarak oraya gidersin

# Bu iki dizin arasında ping-pong gibi gidip gelebilirsin
cd -
cd -
cd -
💡İpucu: cd - komutu aslında $OLDPWD ortam değişkenini kullanır. Önceki dizine dönmek için harika bir kısayol, özellikle config dosyası ile log dizini arasında gidip gelirken zaman kazandırır.

CDPATH: Arama Yolu Tanımlama

Bu özelliği kullanan sysadmin sayısı şaşırtıcı biçimde az. CDPATH, tıpkı PATH ortam değişkeni gibi çalışır ama dizin geçişleri için. Bir kez tanımladıktan sonra, o dizinlerin alt klasörlerine tam yol vermeden girebilirsin.

# ~/.bashrc veya ~/.bash_profile dosyasına ekle
export CDPATH=.:~:/var/www:/etc/apache2:/etc/nginx

# Artık şu şekilde kullanabilirsin:
# /var/www altındaki bir dizine tam yol vermeden girebilirsin
cd html          # Otomatik /var/www/html olarak çözümlenir
cd sites-enabled # Otomatik /etc/apache2/sites-enabled olarak çözümlenir
cd conf.d        # Otomatik /etc/nginx/conf.d olarak çözümlenir

# Değişikliği hemen uygulamak için
source ~/.bashrc

Bu ayarı yaptıktan sonra, web sunucularında en çok kullandığın dizinlere tek kelimeyle ulaşabilirsin. Çok küçük görünüyor ama günde yüzlerce kez bunu yapıyorsan, fark önemli.

Gerçek Dünya Senaryosu: Multi-Site Web Sunucusunda Hızlı Gezinme

Diyelim ki onlarca web sitesi barındıran bir sunucuyu yönetiyorsun. Nginx kullanıyorsun ve bir müşteriden şikâyet geldi: site yavaş açılıyor ve bazı 502 hataları var. İnceleme sürecinde hangi dizinlere gideceksin?

  • /etc/nginx/sites-enabled/ — Virtual host konfigürasyonu
  • /var/log/nginx/ — Hata ve erişim logları
  • /var/www/musteri-adi/ — Site dosyaları
  • /etc/php/8.1/fpm/pool.d/ — PHP-FPM havuz ayarları
  • /var/log/php8.1-fpm.log — PHP-FPM logları

Bu senaryoda nasıl hızlı gezinebilirsin? İşte pratik bir akış:

# Önce Nginx config'e bak
cd /etc/nginx/sites-enabled
ls -la
cat musteri-sitesi.conf

# Hızla log dizinine geç
cd /var/log/nginx
tail -n 50 error.log | grep musteri-sitesi

# Bir önceki dizine (sites-enabled) hızlıca geri dön
cd -

# PHP-FPM havuzuna git
cd /etc/php/8.1/fpm/pool.d
cat musteri-sitesi.conf

# Site dosyalarına bak
cd /var/www/musteri-sitesi/public_html
ls -la

# Herhangi bir anda config dizinine geri dön
cd /etc/nginx/sites-enabled

# Değişiklik sonrası tekrar site dosyalarına:
cd -
Bilgi: Web sunucusu sorun giderme sırasında genellikle 2-3 dizin arasında gidip gelirsin. cd - bu senaryolarda en büyük zaman kazandırıcındır. Daha fazla dizin gerektiğinde ise aşağıda anlatacağım pushd/popd mekanizması devreye girer.

pushd ve popd: Dizin Yığını ile Çalışmak

Birden fazla dizin arasında organize biçimde geçiş yapman gerektiğinde pushd ve popd ikilisi imdadına yetişir. Bu ikili, bir yığın (stack) yapısı kullanır. Dizinleri yığına itersin, işin bitince geri çekersin.

# pushd ile dizine git ve yığına kaydet
pushd /etc/nginx/sites-enabled
# Çıktı: /etc/nginx/sites-enabled ~

pushd /var/log/nginx
# Çıktı: /var/log/nginx /etc/nginx/sites-enabled ~

pushd /etc/php/8.1/fpm/pool.d
# Çıktı: /etc/php/8.1/fpm/pool.d /var/log/nginx /etc/nginx/sites-enabled ~

# Yığını görüntüle
dirs -v
# Çıktı:
#  0  /etc/php/8.1/fpm/pool.d
#  1  /var/log/nginx
#  2  /etc/nginx/sites-enabled
#  3  ~

# Numarayla doğrudan o dizine git
cd ~2
# Artık /etc/nginx/sites-enabled konumundasın

# Yığından çıkar ve bir önceki dizine dön
popd
# Çıktı: /var/log/nginx /etc/nginx/sites-enabled ~

popd
# Çıktı: /etc/nginx/sites-enabled ~

popd
# Çıktı: ~
# Artık home dizinindesin

Bu teknik özellikle karmaşık bakım süreçlerinde, birden fazla konfigürasyon dosyası arasında gezerken çok işe yarıyor. Yığına attığın dizinleri unutmayacaksın çünkü dirs -v ile her zaman görebilirsin.

Tab Tamamlama: Hâlâ Tam Adını mı Yazıyorsun?

Bunu söylemek zorundayım: eğer dizin adlarını hâlâ harfi harfine yazıyorsan, bunu oku. Tab tuşu senin en iyi arkadaşın. Ama birçok kişi tab tamamlamanın gücünü tam olarak kullanmıyor.

# Kısmi isim yaz ve Tab'a bas
cd /var/www/mu[TAB]
# Eğer tekil eşleşme varsa otomatik tamamlar
# /var/www/musteri-sitesi/

# Birden fazla eşleşme varsa Tab'a iki kez bas
cd /var/www/[TAB][TAB]
# Çıktı:
# musteri1/   musteri2/   musteri3/   html/

# Uzun dizin adlarında özellikle faydalı
cd /etc/letsencrypt/live/[TAB][TAB]
# Tüm domain klasörlerini listeler

# bash-completion paketi kuruluysa daha da akıllı çalışır
sudo apt install bash-completion   # Debian/Ubuntu
sudo yum install bash-completion   # RHEL/CentOS
💡İpucu: bash-completion paketi kurulu olduğunda Tab tamamlama yalnızca dizin adlarını değil, komut argümanlarını, paket adlarını ve çok daha fazlasını tamamlayabilir hale gelir. Eğer sunucunda kurulu değilse hemen kur.

Glob Desenleri ile cd Kullanımı

Dizin adının bir kısmını biliyorsun ama tam adını hatırlamıyorsun? Glob desenleri burada devreye girer. Ama dikkatli ol, birden fazla eşleşme varsa beklenmedik sonuçlar alabilirsin.

# Yıldız glob ile dizine gir (tek eşleşme varsa çalışır)
cd /var/www/must*
# /var/www/musteri-sitesi'ne gider

# Soru işareti (tek karakter yerine geçer)
cd /etc/php/?.?/fpm
# /etc/php/8.1/fpm veya /etc/php/7.4/fpm gibi

# Süslü parantez ile alternatifler
cd /etc/{nginx,apache2}
# Hata verir çünkü ikisi de var; ama script içinde kontrol için kullanışlı

# Hangi dizinlerin eşleştiğini önce kontrol et
ls -d /var/www/must*
# Çıktıyı gördükten sonra cd ile git
Uyarı: Glob desenleri birden fazla dizinle eşleşirse cd komutu yalnızca alfabetik sıradaki ilk eşleşmeye gider ve diğerlerini sessizce yok sayar. Üretim sunucusunda beklediğin yerde olmayabilirsin. Tab tamamlama bu durumda daha güvenlidir.

Alias Tanımlama: Sık Gidilen Dizinler İçin Kısayollar

Web sunucusu yöneticisi olarak her gün aynı dizinlere gidiyorsun. Bu dizinler için alias tanımlamak, uzun yolları ezberleme derdini ortadan kaldırır.

# ~/.bashrc dosyasına ekle
# Web sunucusu dizinleri
alias cdwww='cd /var/www/html'
alias cdnginx='cd /etc/nginx'
alias cdapache='cd /etc/apache2'
alias cdlogs='cd /var/log/nginx'
alias cdfpm='cd /etc/php/8.1/fpm/pool.d'
alias cdssl='cd /etc/letsencrypt/live'
alias cdsites='cd /etc/nginx/sites-enabled'

# Özel müşteri dizinleri (sunucuya göre özelleştir)
alias cdmust1='cd /var/www/musteri1/public_html'
alias cdmust2='cd /var/www/musteri2/public_html'

# Değişiklikleri uygula
source ~/.bashrc

# Artık kullanabilirsin
cdlogs
# /var/log/nginx dizinine gider

cdsites
# /etc/nginx/sites-enabled dizinine gider

Bu alias’ları bir kez tanımladıktan sonra hayatın çok daha kolay hale gelir. Yeni bir sunucuya geçtiğinde bu .bashrc dosyasını yanında götür ya da bir dotfiles reposu oluştur.

Fonksiyon Tabanlı Akıllı Gezinme

Alias yetmediğinde Bash fonksiyonları devreye girer. Mesela hangi müşteri sitesine gideceğini parametre olarak geçebileceğin bir fonksiyon yazabilirsin:

# ~/.bashrc dosyasına ekle

# Müşteri site dizinine hızlı erişim
cdsite() {
    local site_path="/var/www/$1"
    if [ -d "$site_path" ]; then
        cd "$site_path" && echo "Dizin: $site_path"
        ls -la
    else
        echo "Hata: $site_path bulunamadı."
        echo "Mevcut siteler:"
        ls /var/www/
    fi
}

# Nginx log dosyasına hızlı erişim
cdlog() {
    if [ -z "$1" ]; then
        cd /var/log/nginx && ls -lt | head -20
    else
        cd /var/log/nginx && tail -f "$1".access.log
    fi
}

# Kullanım:
cdsite musteri1
# /var/www/musteri1 dizinine gider ve içeriği listeler

cdsite yanlisad
# Hata: /var/www/yanlisad bulunamadı.
# Mevcut siteler: musteri1 musteri2 html

Sembolik Linkler ve cd: Dikkat Edilmesi Gerekenler

Web sunucularında sembolik linkler son derece yaygın. Nginx’in sites-enabled dizini, sites-available‘daki konfigürasyonlara sembolik link içerir. Bu noktada cd ile gezinirken bazı farklılıklar ortaya çıkabilir.

# Sembolik link üzerinden dizine git
cd /etc/nginx/sites-enabled
ls -la
# musteri1.conf -> /etc/nginx/sites-available/musteri1.conf

# pwd komutu mantıksal yolu gösterir (varsayılan davranış)
pwd
# /etc/nginx/sites-enabled

# Fiziksel (gerçek) yolu görmek için -P flag'i
pwd -P
# /etc/nginx/sites-enabled (eğer dizinin kendisi link değilse)

# cd -P ile sembolik linkleri takip etmeden fiziksel dizine git
cd -P /var/www/html
# Eğer html bir sembolik link ise, gerçek dizine gider

# cd -L ile mantıksal yolu koru (varsayılan)
cd -L /var/www/html

# Örnek: Yanlış anlama durumu
ln -s /srv/web/musteri1 /var/www/musteri1
cd /var/www/musteri1
pwd
# /var/www/musteri1 (mantıksal yol)

cd -P /var/www/musteri1
pwd
# /srv/web/musteri1 (fiziksel yol)
Uyarı: Script yazarken sembolik linklerin takip edilip edilmediği kritik önem taşıyabilir. Özellikle dosya izinlerini ve sahipliğini değiştirdiğinde, yanlış dizinde işlem yapıyor olabilirsin. Script içinde her zaman pwd -P ile gerçek konumu doğrula.

Karşılaştırma Tablosu: cd Tekniklerinin Kullanım Alanları

TeknikKomutEn İyi Kullanım AlanıZorluk
Önceki dizine döncd -2 dizin arası geçişKolay
Dizin yığınıpushd/popd3+ dizin arası geçişOrta
CDPATHexport CDPATH=...Sık gidilen üst dizinlerKolay
Aliasalias cdlogs=...Sabit dizin kısayollarıKolay
Bash Fonksiyonucdsite() {...}Dinamik parametre gereken durumlarOrta
Tab TamamlamaTab / Tab TabHer zaman, her yerdeKolay
Fiziksel yolcd -PSembolik link ortamlarıKolay

Bonus: zsh ve fish Kullanıcıları İçin Ekstralar

Eğer sunucularda Bash yerine zsh veya fish kullanıyorsan (ki bazı modern sistemlerde varsayılan shell zsh oldu), ekstra güçlere sahipsin demektir.

# zsh: AUTO_CD özelliği — cd yazmana gerek kalmaz!
# ~/.zshrc dosyasına ekle:
setopt AUTO_CD

# Artık sadece dizin adını yazman yeterli
/var/www/html
# Otomatik olarak o dizine gider

# zsh: Dizin adındaki hataları düzeltme
setopt CORRECT

# zsh: Kısa yol değiştirme — mevcut yoldaki bir kısmı değiştir
# Şu an /var/www/musteri1/public_html konumundasın:
cd musteri1 musteri2
# /var/www/musteri2/public_html'e gider
# Bu özellik bash'te yoktur ama zsh'de çok kullanışlıdır!

# Oh-My-Zsh kullanıyorsan 'd' komutu dizin geçmişini gösterir
d
# 0  /var/www/musteri1/public_html
# 1  /etc/nginx/sites-enabled
# 2  /var/log/nginx
# Sonra sadece numara yaz: 2 -> /var/log/nginx'e gider
Bilgi: zsh’nin cd musteri1 musteri2 sözdizimi (yol parçası değiştirme) birden fazla aynı yapıda site barındıran web sunucularında inanılmaz derecede kullanışlıdır. Benzer dizin yapıları arasında tek komutla geçiş yapabilirsin.

Özet: Hangisini Ne Zaman Kullan?

Tüm bu teknikleri kafana yüklemene gerek yok. Şu basit karar ağacını takip et:

  • Sadece bir önceki dizine mi dönmek istiyorsun?cd - kullan
  • 3 veya daha fazla dizin arasında organize geçiş mi yapacaksın?pushd/popd kullan
  • Belirli üst dizinlerin altına hızlı erişim mi istiyorsun?CDPATH tanımla
  • Sürekli aynı dizinlere mi gidiyorsun? → Alias veya fonksiyon yaz
  • Dizin adını tam hatırlamıyorsun? → Tab Tab ile listele
  • Sembolik link ortamında mısın?cd -P ile fiziksel yola git

Sonraki Adımlar

Bu yazıda anlattıkları hemen uygulamak istiyorsan şu sırayla başla:

  • Bugün: cd - ve pushd/popd kullanmaya başla. Birkaç gün içinde refleks haline gelir.
  • Bu hafta: ~/.bashrc dosyana web sunucusu dizinleri için alias’lar ekle. CDPATH değişkenini yapılandır.
  • Bu ay: Tekrarlayan iş akışlarını analiz et ve bunlar için Bash fonksiyonları yaz. Dotfiles reposu oluşturmayı düşün.
  • İleri seviye: autojump veya zoxide araçlarını incele. Bunlar dizin geçmişini öğrenerek en sık gidilen yerlere tek harfle ulaşmanı sağlar.

Terminal’de hız, küçük alışkanlıkların birikmesiyle gelir. cd gibi görünüşte basit bir komutla dakikalar, hatta saatler kazanabilirsin. Önemli olan bu teknikleri okuyup geçmemek; hemen denemek ve alışkanlık haline getirmek. Şimdi terminali aç ve bir dene.