cd Komutu: Linux ve Windows’ta Dizinler Arasında Gezinme Teknikleri

Yıllarca terminal kullansanız bile bazı temel komutların ne kadar derin olduğunu fark etmeyebilirsiniz. cd bunların başında geliyor. “Sadece dizin değiştiren basit bir komut” diye düşünebilirsiniz, ama doğru kullanıldığında iş akışınızı ciddi ölçüde hızlandıran onlarca teknik barındırıyor. Bu yazıda hem yeni başlayanlar için temelleri hem de deneyimli sysadmin’lerin bile gözden kaçırdığı ince noktaları ele alacağız.

Temel Kullanım: Bildiğinizi Sandığınız Şeyler

cd (change directory), kabuk üzerinde çalışan bir built-in komuttur. Yani /usr/bin/cd diye bir binary yok, doğrudan bash veya zsh gibi shell’in içinde yaşıyor. Bu yüzden which cd yazdığınızda tatmin edici bir sonuç alamazsınız.

En temel kullanımı zaten hepimiz biliyoruz:

cd /etc
cd /var/log
cd /home/kullanici/belgeler

Ama işte buradan sonrası ilginçleşiyor.

Göreceli ve Mutlak Yollar

Mutlak yollar her zaman / ile başlar ve sistemin kök dizininden itibaren tam adresi belirtir:

cd /var/log/nginx
cd /etc/systemd/system
cd /home/ahmet/projeler/web-app

Göreceli yollar ise o an bulunduğunuz dizine göre hesaplanır:

# /home/ahmet dizinindeyken
cd belgeler           # /home/ahmet/belgeler'e gider
cd belgeler/2024      # /home/ahmet/belgeler/2024'e gider
cd ../mehmet          # /home/mehmet'e gider
cd ../../etc          # /etc'e gider

Göreceli yollar script yazarken bazen tehlikeli olabilir. Eğer script’iniz beklenmedik bir dizinde çalışırsa işler karışabilir. Production ortamlarında script’lerde mutlak yollar kullanmayı tercih edin.

Özel Dizin Kısayolları

Tilde (~) ile Ev Dizinine Gitmek

cd ~              # Kendi ev dizinine gider (/home/ahmet gibi)
cd ~/belgeler     # Ev dizininin altındaki belgeler klasörüne gider
cd ~mehmet        # mehmet kullanıcısının ev dizinine gider (root yetkisi gerekebilir)
cd ~root          # root'un ev dizinine gider (/root)

~ işareti $HOME değişkeninin kısaltmasıdır. Hangisini kullanırsanız kullanın sonuç aynı:

cd ~
cd $HOME
# İkisi de aynı yere götürür

Tek Başına cd

Argümansız cd komutu sizi direkt ev dizininize götürür:

cd    # /home/kullanici'ya gider, ~ ile aynı sonuç

Bunu özellikle uzun bir dizinde kaybolduğunuzda “sıfırlanmak” için kullanabilirsiniz.

cd – : En Az Kullanılan En Faydalı Kısayol

Şimdi gelelim çoğu kişinin bilmediği ama öğrendikten sonra vazgeçemeyeceği özelliğe: cd -

Bu komut sizi bir önceki bulunduğunuz dizine götürür. Shell, OLDPWD değişkeninde son dizini tutar ve cd - bunu kullanır.

cd /etc/nginx/conf.d
cd /var/log/nginx
cd -    # /etc/nginx/conf.d'ye döner
cd -    # /var/log/nginx'e döner (ileri-geri gidip gelir)

Gerçek dünya senaryosu: Bir web sunucusunda sorun gideriyorsunuz. Hem /etc/nginx/conf.d dizinindeki config dosyalarına hem de /var/log/nginx dizinindeki loglara bakmanız gerekiyor. cd - ile iki dizin arasında sürekli gidip gelebilirsiniz.

Nokta ve Çift Nokta Kullanımı

cd .     # Bulunduğunuz dizinde kalır (işe yaramaz gibi görünse de script'lerde kullanılır)
cd ..    # Bir üst dizine çıkar
cd ../.. # İki üst dizine çıkar
cd ../../usr/local/bin  # İki üst çıkıp oradan ilerler

Çok katmanlı proje yapılarında çalışırken .. zincirleme kullanımı oldukça yaygındır:

# /home/ahmet/projeler/web-app/src/components/ui dizinindeyken
cd ../../../     # /home/ahmet/projeler/web-app'e çıkar

pushd ve popd: Dizin Yığını Yönetimi

cd - sadece bir önceki dizini hatırlıyordu. Peki ya birden fazla dizin arasında gezinmeniz gerekirse? İşte burada pushd ve popd devreye giriyor.

pushd /etc/nginx          # /etc/nginx'e geçer ve yığına ekler
pushd /var/log/nginx      # /var/log/nginx'e geçer ve yığına ekler
pushd /home/ahmet/backup  # /home/ahmet/backup'a geçer ve yığına ekler

dirs                      # Yığındaki tüm dizinleri gösterir
# /home/ahmet/backup /var/log/nginx /etc/nginx ~

popd    # /var/log/nginx'e döner
popd    # /etc/nginx'e döner
popd    # Başlangıç dizinine (ev dizini) döner

pushd komutuna numara vererek yığındaki belirli bir konuma da atlayabilirsiniz:

pushd /etc
pushd /var
pushd /tmp
pushd /usr/local

dirs -v
# 0  /usr/local
# 1  /tmp
# 2  /var
# 3  /etc
# 4  ~

pushd +2    # /var'a gider (2. indeks)

Bu teknik özellikle sistem bakım scriptlerinde, birden fazla dizini sırayla ziyaret etmeniz gereken durumlarda çok işe yarar.

Tab Tamamlama ile Verimli Gezinme

cd komutunun hızını artıran en büyük yardımcı Tab tamamlamadır. Ama bunu sadece tek dizin için değil, zincirleme olarak kullanabilirsiniz:

cd /et<TAB>         # /etc/ olur
cd /etc/ng<TAB>     # /etc/nginx/ olur
cd /etc/nginx/c<TAB>  # seçenekleri listeler veya tamamlar

Bash’te çift Tab ile mevcut seçenekleri listeleyebilirsiniz. Zsh’de ise daha gelişmiş bir tamamlama sistemi var ve ok tuşlarıyla seçim yapabiliyorsunuz.

Ortam Değişkenleri ile Akıllı Gezinme

Sık kullandığınız dizinleri değişkenlere atayabilirsiniz. Özellikle uzun ve karmaşık path’ler için bu teknik hayat kurtarır:

# .bashrc veya .bash_profile'a ekleyin
export PROJELER="/home/ahmet/projeler"
export WEBROOT="/var/www/html"
export LOGDIR="/var/log/nginx"
export BACKUP="/mnt/yedek/sunucu01"

# Kullanım
cd $PROJELER
cd $WEBROOT/mysite
cd $LOGDIR

Daha da ileri gidebilir ve kısayol fonksiyonları yazabilirsiniz:

# .bashrc'ye ekle
function prj() {
    cd /home/ahmet/projeler/$1
}

function log() {
    cd /var/log/$1
}

# Kullanım
prj web-app          # /home/ahmet/projeler/web-app'e gider
prj api-server       # /home/ahmet/projeler/api-server'e gider
log nginx            # /var/log/nginx'e gider
log apache2          # /var/log/apache2'ye gider

CDPATH: cd’nin Gizli Silahı

CDPATH değişkeni, cd komutunun hangi dizinleri arayacağını belirler. PATH değişkeninin cd versiyonu olarak düşünebilirsiniz:

# .bashrc'ye ekle
export CDPATH=.:~:/var/www:/etc:/var/log

# Artık tam path vermeden dizin adı yazabilirsiniz
cd nginx     # /etc/nginx veya /var/log/nginx'i bulur
cd html      # /var/www/html'ye gider

CDPATH tanımlıyken cd şu sırayla arar:

  1. Mevcut dizin (.)
  2. Ev dizini (~)
  3. /var/www
  4. /etc
  5. /var/log

Birden fazla eşleşme varsa ilkini kullanır. Bu nedenle CDPATH‘i dikkatli yapılandırın.

# Örnek CDPATH yapılandırması
export CDPATH=".:$HOME:$HOME/projeler:/var/www:/etc/nginx:/var/log"

Gerçek Dünya Senaryoları

Senaryo 1: Web Sunucusu Sorun Giderme

Bir müşteriden “site açılmıyor” diye çağrı aldınız. Aşağıdaki gezinme akışını kullanıyorsunuz:

# Log'lara bak
cd /var/log/nginx
tail -f error.log

# Config'i kontrol et
cd /etc/nginx/sites-enabled
ls -la
cat default

# Uygulamanın kök dizinine git
cd /var/www/html
ls -la

# Geri dön ve bir şeyleri karşılaştır
cd -    # /etc/nginx/sites-enabled'a döner

Senaryo 2: Çoklu Sunucu Bakımı Script’i

#!/bin/bash

# Yedek dizinini yığına ekle
pushd /var/backups

# Log dizinine geç ve temizle
pushd /var/log
find . -name "*.log" -mtime +30 -delete
echo "Eski loglar temizlendi"

# Nginx loglarına geç
pushd nginx
gzip access.log
mv access.log.gz /var/backups/
echo "Nginx log yedeklendi"

# Yığını temizle ve başlangıç noktasına dön
popd  # /var/log'a döner
popd  # /var/backups'a döner
popd  # Başlangıç dizinine döner

echo "İşlem tamamlandı, şu an: $(pwd)"

Senaryo 3: Boşluklu Dizin İsimlerinde Gezinme

Bazen dizin isimleri boşluk içerir (özellikle samba paylaşımları veya Windows’tan kopyalanan dosyalarda):

# Yanlış kullanım
cd /mnt/paylasim/Proje Dosyaları   # Hata verir

# Doğru kullanımlar
cd "/mnt/paylasim/Proje Dosyaları"
cd /mnt/paylasim/Proje Dosyaları
cd '/mnt/paylasim/Proje Dosyaları'

Shell Alias’ları ile cd’yi Güçlendirin

# .bashrc'ye ekleyin

# Sık kullanılan dizinler için alias
alias etc='cd /etc'
alias log='cd /var/log'
alias www='cd /var/www/html'
alias home='cd ~'

# Üst dizin navigasyonu kolaylaştırma
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'

# Son komutu çalıştırdıktan sonra dizini göster
alias cd='cd "$@" && ls --color=auto'

Son alias’a dikkat edin: cd‘yi ls ile birleştiriyorsunuz. Bu tartışmalı bir tercih, bazıları sever bazıları sevmez, ama verimlilik açısından güçlü.

zsh’de Özel cd Özellikleri

Eğer zsh kullanıyorsanız, bazı ekstra özelliklerden faydalanabilirsiniz:

# zsh'de bu özelliği aktif et (.zshrc'ye ekle)
setopt AUTO_CD

# Artık cd yazmadan sadece dizin adını yazabilirsiniz
/etc/nginx    # cd /etc/nginx gibi davranır
..            # cd .. gibi davranır
# zsh ile çoklu dizin değiştirme
cd /usr/local/bin
cd bin share    # "bin" kısmını "share" ile değiştirir: /usr/local/share'e gider

# Bu çok güçlü bir özellik!
cd /etc/nginx/sites-enabled
cd enabled available   # /etc/nginx/sites-available'a gider

Hata Ayıklama: pwd ve Dizin Doğrulama

Script yazarken nerede olduğunuzdan emin olmak kritiktir:

#!/bin/bash
set -e  # Hata durumunda dur

HEDEF="/var/www/html/uploads"

# Dizinin var olup olmadığını kontrol et
if [ ! -d "$HEDEF" ]; then
    echo "Hata: $HEDEF dizini bulunamadı!"
    exit 1
fi

cd "$HEDEF" || { echo "cd başarısız oldu!"; exit 1; }

echo "Şu an: $(pwd)"
# Devam et...

cd || exit kalıbı production script’lerinde her zaman kullanın. cd başarısız olursa ve siz kontrol etmezseniz, script yanlış dizinde çalışmaya devam eder. Bu ciddi sonuçlar doğurabilir, özellikle rm gibi komutlar içeriyorsa.

Performans İpuçları

Büyük ve derin dizin yapılarında çalışırken gezinmeyi hızlandırmak için:

  • autojump veya z gibi araçları kurun. Bunlar sık ziyaret ettiğiniz dizinleri öğrenir ve j nginx gibi kısaltmalarla oraya atlayabilirsiniz.
  • fzf (fuzzy finder) ile dizin arama kombinasyonu son derece verimli: cd $(find /etc -type d | fzf)
  • Karmaşık proje yapılarında direnv aracını kullanın, dizine girdiğinizde otomatik ortam değişkenleri yükler.

Sonuç

cd komutu görünürde basit ama altında birçok güçlü özellik barındırıyor. cd - ile iki dizin arasında ping-pong oynamak, pushd/popd ile dizin yığını yönetmek, CDPATH ile akıllı arama yapmak ve alias’larla iş akışınızı kişiselleştirmek, terminal verimliliğinizi ciddi ölçüde artıracak.

Bir sysadmin olarak günde yüzlerce kez dizin değiştiriyorsunuz. Bu tekniklerin sadece birkaç tanesini bile rutininize katarsanız, ayda saatler kazanırsınız. Küçük optimizasyonlar büyük fark yaratır.

En önemli tavsiyem: Her yeni tekniği öğrendikten hemen sonra pratiğe dökün. Bilmek ile refleks haline getirmek arasındaki fark, gerçek verimliliği belirliyor. .bashrc‘nizi açın, bu yazıdaki alias ve fonksiyonları ekleyin, yeni bir terminal açın ve alışkanlık haline gelinceye kadar kullanın.

Terminal sizin oyun alanınız, cd de onun pusulası. İyi gezinmeler!

Yorum yapın