mkdir Komutu: Dizin Oluşturma ve Gelişmiş Kullanımı

mkdir komutu göründüğünden çok daha güçlü bir araç. Temel dizin oluşturmanın ötesine geçip, iç içe yapılar, izin yönetimi ve web sunucusu kurulumlarında nasıl kullanacağını bu yazıda adım adım ele alıyoruz.

Sysadmin olarak günde kaç kez mkdir yazıyorsun? Muhtemelen o kadar çok ki artık düşünmeden yapıyorsun. Ama şunu sormam lazım: mkdir‘ın bütün yeteneklerini gerçekten kullanıyor musun? Çoğu kişi bu komutu sadece tek bir dizin oluşturmak için kullanıyor ve olayı orada kapatıyor. Oysa mkdir, doğru kullanıldığında seni onlarca tekrarlayan komuttan kurtarabilir, özellikle web sunucusu kurulumlarında hayat kurtarıcı oluyor.

Bu yazıda mkdir’ı sıfırdan ele alacağız. Temel kullanımdan başlayıp, gelişmiş seçeneklere, gerçek web sunucusu senaryolarına ve sık yapılan hatalara kadar her şeyi konuşacağız. Hazırsan başlayalım.

mkdir Nedir ve Ne İşe Yarar?

mkdir, “make directory” yani “dizin oluştur” anlamına gelir. Linux, macOS ve Windows’ta (hem CMD hem PowerShell üzerinden) kullanılabilen temel bir komuttur. Görevi basit: belirttiğin yerde dizin oluşturmak. Ama bu basit görevin arkasında, işini çok daha verimli yapmanı sağlayacak bir sürü parametre var.

Özellikle web sunucusu yönetimi yapıyorsan — Apache, Nginx, ya da Node.js tabanlı bir şey kuruyorsan — dizin yapılarını doğru ve hızlı oluşturmak kritik. Yanlış izinle oluşturulmuş bir dizin, saat başı dönen bir destek talebi demek. Bunu yaşadın mı biliyorum, herkes yaşadı.

Temel Kullanım

En basit haliyle mkdir şöyle çalışır:

# Tek bir dizin oluştur
mkdir mywebsite

# Tam yol belirterek dizin oluştur
mkdir /var/www/mywebsite

# Aynı anda birden fazla dizin oluştur
mkdir logs uploads cache temp

Bu kadar basit. Ama dikkat et: eğer oluşturmaya çalıştığın dizinin üst dizini yoksa, mkdir hata verir. Mesela /var/www/mywebsite/public oluşturmak istiyorsan ve mywebsite henüz yoksa, komut çakılır. İşte burada -p bayrağı devreye giriyor.

-p Parametresi: En Çok Kullandığın Seçenek Olacak

-p parametresi (“parents” yani üst dizinler) olmayan tüm üst dizinleri otomatik olarak oluşturur. Üstelik zaten var olan bir dizin için hata vermez — bunu özellikle belirtmek istiyorum çünkü script yazarken bu davranış kritik önem taşır.

# İç içe dizin yapısını tek komutla oluştur
mkdir -p /var/www/mywebsite/public_html

# Birden fazla iç içe yapı aynı anda
mkdir -p /var/www/mywebsite/{public_html,logs,ssl,backup}

# Daha karmaşık bir web projesi yapısı
mkdir -p /var/www/myproject/{public,src/{controllers,models,views},config,logs,tests}

Son komuta dikkat et. Süslü parantez genişletmesi (brace expansion) ile tek bir satırda tüm proje iskeletini oluşturuyorsun. Bu bash’ın bir özelliği, mkdir’ın değil — ama ikisini birlikte kullanınca gerçekten güçlü bir kombinasyon elde ediyorsun.

💡İpucu: Brace expansion’ı kullanırken süslü parantezler arasında boşluk bırakma. {public, src} değil {public,src} yazmalısın. Boşluk bırakırsan bash bunu tek bir string olarak yorumlar ve beklediğin sonucu alamazsın.

-m Parametresi: Dizini Oluştururken İzinleri Ayarla

Bu parametre, özellikle web sunucusu kurulumlarında seni ayrı bir chmod adımından kurtarır. Dizini oluştururken aynı anda izinlerini de belirleyebilirsin.

# 755 izniyle dizin oluştur (web dizinleri için yaygın)
mkdir -m 755 /var/www/mywebsite

# 700 izniyle gizli/hassas dizin oluştur
mkdir -m 700 /var/www/mywebsite/private

# -p ile birlikte kullanım
mkdir -m 755 -p /var/www/mywebsite/public_html

# Yalnızca sahibinin okuyabileceği log dizini
mkdir -m 600 /var/www/mywebsite/secure_logs
Uyarı: -m parametresini -p ile birlikte kullandığında dikkatli ol. -m yalnızca en son oluşturulan (hedef) dizine uygulanır, ara üst dizinlere değil. Üst dizinlerin izinleri umask değerinden etkilenir. Kritik ortamlarda her dizinin iznini ayrıca doğrula.

-v Parametresi: Ne Olduğunu Gör

-v (verbose) parametresi, oluşturulan her dizin için ekrana bilgi yazar. Script yazarken veya büyük bir yapı oluştururken gerçekten ne yapıldığını görmek istiyorsan bu bayrağı ekle.

# Verbose mod ile dizin oluştur
mkdir -pv /var/www/newsite/{public_html,logs,ssl}

# Örnek çıktı:
# mkdir: created directory '/var/www/newsite'
# mkdir: created directory '/var/www/newsite/public_html'
# mkdir: created directory '/var/www/newsite/logs'
# mkdir: created directory '/var/www/newsite/ssl'

Özellikle büyük otomasyonlarda ya da bir junior’a bir şeyler anlatırken verbose mod çok işe yarıyor. Ne oluşturuldu, ne oluşturulmadı — her şey gözünün önünde.

Tüm Parametreler Hızlı Başvuru Tablosu

ParametreUzun AdAçıklamaÖrnek
-p--parentsEksik üst dizinleri de oluşturur, var olanlar için hata vermezmkdir -p /a/b/c
-m--modeDizin izinlerini belirler (chmod formatında)mkdir -m 755 /dir
-v--verboseHer oluşturulan dizin için mesaj yazarmkdir -v /dir
-ZSELinux bağlamını varsayılana ayarlarmkdir -Z /dir
--helpYardım metnini gösterirmkdir --help
--versionSürüm bilgisini gösterirmkdir --version

Gerçek Dünya Senaryosu 1: Apache Web Sunucusu Kurulumu

Yeni bir Apache sanal sunucusu (virtual host) kuruyorsun. Standart dizin yapısını elle tek tek oluşturmak yerine aşağıdaki script’i kullan. Bu benim yıllardır kullandığım, ufak tefek geliştirdiğim bir yaklaşım.

#!/bin/bash
# Apache sanal sunucusu için dizin yapısı oluşturma scripti

DOMAIN="example.com"
WEBROOT="/var/www"
WWW_USER="www-data"

# Ana dizin yapısını oluştur
mkdir -pv ${WEBROOT}/${DOMAIN}/{public_html,logs,ssl,backup}

# Log dizini için özel izinler
mkdir -m 750 -p ${WEBROOT}/${DOMAIN}/logs

# Public HTML için doğru izinler
chmod 755 ${WEBROOT}/${DOMAIN}/public_html

# Sahipliği web sunucusu kullanıcısına ver
chown -R ${WWW_USER}:${WWW_USER} ${WEBROOT}/${DOMAIN}

# Doğrulama
ls -la ${WEBROOT}/${DOMAIN}/
echo "Dizin yapısı ${DOMAIN} için oluşturuldu."

Bu script’i /usr/local/bin/setup-vhost.sh olarak kaydedip çalıştırılabilir yaparsan, her yeni domain için tek satırla kullanabilirsin. Domain adını değişken olarak geçirmek istersen script’e parametre desteği eklemek de çok basit.

Gerçek Dünya Senaryosu 2: Nginx + PHP-FPM Projesi

Nginx kullananlar için biraz farklı bir yapı tercih ediliyor. Özellikle PHP-FPM ile çalışıyorsan, socket dosyası için ayrı bir dizin, önbellek için ayrı bir alan lazım.

# Nginx + PHP-FPM projesi için tam dizin yapısı
PROJECT="myapp"

mkdir -pv /var/www/${PROJECT}/{public,storage/{logs,cache,sessions,uploads},config}

# PHP-FPM socket dizini
mkdir -m 710 -p /run/php/${PROJECT}

# Nginx önbellek dizini
mkdir -m 755 -p /var/cache/nginx/${PROJECT}

# İzinleri ayarla
chown -R www-data:www-data /var/www/${PROJECT}/storage
chmod -R 775 /var/www/${PROJECT}/storage

# Yapıyı görüntüle
find /var/www/${PROJECT} -type d | sort
Bilgi: Laravel gibi PHP framework’leri kullanıyorsan, storage dizininin altındaki klasörlerin www-data tarafından yazılabilir olması şart. Yoksa session, cache ve log sorunlarıyla karşılaşırsın. mkdir -m 775 ile oluşturmak bu sorunu baştan çözer.

Gerçek Dünya Senaryosu 3: Node.js / Next.js Projesi

Node.js tabanlı bir uygulama deploy ediyorsun. PM2 ile çalışıyorsa log dosyaları için, statik dosyalar için ve uploads için yapıyı önceden kurmak işleri kolaylaştırır.

# Node.js projesi için dizin yapısı
APP_NAME="nextjs-app"
APP_DIR="/var/www/${APP_NAME}"

# Ana yapı
mkdir -pv ${APP_DIR}/{current,releases,shared/{logs,uploads,config}}

# PM2 log dizini
mkdir -m 755 -p /home/deploy/.pm2/logs

# Nginx statik dosyalar için
mkdir -m 755 -p /var/www/${APP_NAME}/public/static

# Sahiplik ataması (deploy kullanıcısı varsayılıyor)
chown -R deploy:deploy ${APP_DIR}
chown -R www-data:www-data ${APP_DIR}/public

echo "Node.js proje yapısı hazır: ${APP_DIR}"

Windows’ta mkdir: PowerShell ve CMD

Windows tarafında iş yapıyorsan da mkdir komutu var, hem CMD hem PowerShell’de çalışır. Ama davranış biraz farklı, bunu bilmekte fayda var.

CMD’de mkdir ve md aynı şeydir. -p bayrağına gerek yok, CMD varsayılan olarak üst dizinleri oluşturur:

# PowerShell ile tek dizin
New-Item -ItemType Directory -Path "C:inetpubmysite"

# PowerShell ile iç içe dizin yapısı (-Force var olan dizinde hata vermez)
New-Item -ItemType Directory -Force -Path "C:inetpubmysitelogs"
New-Item -ItemType Directory -Force -Path "C:inetpubmysiteuploads"
New-Item -ItemType Directory -Force -Path "C:inetpubmysitessl"

# mkdir alias'ı PowerShell'de de çalışır
mkdir -Force "C:inetpubmysitepublic"

# Birden fazla dizin oluştur (döngüyle)
$dirs = @("logs", "uploads", "ssl", "backup", "config")
foreach ($dir in $dirs) {
    New-Item -ItemType Directory -Force -Path "C:inetpubmysite$dir"
    Write-Host "Oluşturuldu: C:inetpubmysite$dir"
}
Bilgi: PowerShell’de mkdir aslında New-Item -ItemType Directory komutunun bir alias’ıdır. Her ikisi de aynı işi yapar ama script’lerde okunabilirlik açısından tam adını kullanmak daha iyidir.

Sık Yapılan Hatalar ve Çözümleri

Hata 1: “cannot create directory: No such file or directory”

Üst dizin yok, -p kullanmadın. Çözüm basit:

# Hatalı kullanım
mkdir /var/www/site/public_html  # /var/www/site henüz yok

# Doğru kullanım
mkdir -p /var/www/site/public_html

Hata 2: “Permission denied”

Hedef konumda yazma izniniz yok. sudo kullanman ya da doğru kullanıcıya geçmen gerekiyor:

# Permission denied aldığında
sudo mkdir -p /var/www/mysite

# Sonra kendi kullanıcına veya www-data'ya sahipliği ver
sudo chown -R $USER:$USER /var/www/mysite
# ya da
sudo chown -R www-data:www-data /var/www/mysite

Hata 3: Yanlış İzinle Oluşturulmuş Dizin

Umask değerin beklenenden farklı izinler üretebilir. Özellikle shared hosting ortamlarında ya da özelleştirilmiş sunucularda bu başını ağrıtabilir.

# Mevcut umask değerini kontrol et
umask

# Dizin oluşturduktan sonra izni kontrol et
ls -ld /var/www/mysite

# İzni düzelt
chmod 755 /var/www/mysite

# Alternatif: Kesin izinle mkdir kullan
mkdir -m 755 -p /var/www/mysite
Uyarı: Web dizinlerinde asla 777 izni kullanma. Bu, sunucudaki herhangi bir kullanıcının veya güvenlik açığı yoluyla saldırganın dizine yazmasına izin verir. Web sunucusu için standart olan 755 (dizinler) ve 644 (dosyalar) kombinasyonu çoğu durumda yeterlidir. Özel yazma ihtiyacı varsa sahipliği doğru kullanıcıya ata.

Bonus: Tarih Bazlı Log Dizinleri Oluşturma

Log yönetimi yapıyorsan, tarihe göre otomatik dizin oluşturmak çok işe yarıyor. Bunu cron job’a bağlarsan her gece otomatik olarak çalışır.

#!/bin/bash
# Tarih bazlı log dizini oluşturma - cron'a eklenebilir

LOG_BASE="/var/log/myapp"
DATE=$(date +%Y/%m/%d)

# Bugünün tarihine göre dizin oluştur
mkdir -pv "${LOG_BASE}/${DATE}"

# Sahipliği ayarla
chown www-data:www-data "${LOG_BASE}/${DATE}"

# 30 günden eski log dizinlerini sil
find ${LOG_BASE} -type d -mtime +30 -exec rm -rf {} + 2>/dev/null

echo "Log dizini hazır: ${LOG_BASE}/${DATE}"

Bu script’i /etc/cron.daily/ altına koyarsan sistem her gece otomatik çalıştırır. Hem yeni dizini hazırlar hem de eski logları temizler.

Özet

mkdir, basit görünümünün arkasında güçlü bir araç. Özellikle şu noktaları aklında tut:

  • -p parametresi olmadan çalışıyorsan eksik kalıyorsun. Her script’inde kullan.
  • -m ile izinleri baştan belirle, sonradan chmod ile uğraşma.
  • -v parametresi, özellikle otomasyonda debug için çok değerli.
  • Brace expansion ile tek komutta karmaşık dizin yapıları oluşturabilirsin.
  • Web sunucusu dizinlerinde izin yönetimini asla ihmal etme; 777 kesinlikle hayır.
  • Windows’ta mkdir çalışır ama PowerShell’de New-Item -ItemType Directory -Force tercih edilmeli.

Sonraki Adımlar

mkdir’ı kavradıktan sonra sıradaki adımlar şunlar olabilir:

  • chmod ve chown: Dizin izinlerini ve sahipliğini tam anlamıyla kontrol etmeyi öğren. mkdir ile başladığın iş, bu komutlarla tamamlanıyor.
  • find komutu: Oluşturduğun dizin yapılarını yönetmek, aramak ve toplu işlemler yapmak için şart.
  • Bash scripting: mkdir tek başına güçlü ama bir script içinde değişkenler, döngüler ve koşullarla birleşince gerçek gücünü ortaya koyuyor.
  • rsync ile dizin senkronizasyonu: Oluşturduğun yapıları sunucular arasında taşımak için rsync’i incele.
  • ACL (Access Control Lists): Temel chmod izinlerinin yetmediği durumlarda, ACL ile daha ince izin yönetimi yapabilirsin.

Sorun yaşıyorsan ya da farklı bir senaryon varsa yorumlarda anlat, bakıp yanıtlarım. Sysadmin dünyasında kimse her şeyi tek başına öğrenmez, paylaşmak meseleye dahil.

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.