Linux dünyasında her şey dosya ve dizinlerden oluşur. Sistem yöneticisi olarak günde onlarca kez dizin oluşturursunuz ve bu işlemin temel aracı mkdir komutudur. “Make Directory” kelimelerinin kısaltması olan bu komut, ilk bakışta son derece basit görünse de arka planda oldukça güçlü özellikler barındırır. Bu yazıda mkdir komutunu tüm detaylarıyla ele alacağız, gerçek dünya senaryolarıyla pekiştireceğiz.
Temel Kullanım
mkdir komutunun en basit kullanımı tek bir dizin oluşturmaktır:
mkdir yeni_dizin
Bu kadar. Ama işin aslı burada bitmez. Gelin adım adım derinleşelim.
Söz Dizimi
mkdir [SEÇENEKLER] DIZIN_ADI...
Birden fazla dizin adı vererek tek seferde birkaç dizin oluşturabilirsiniz:
mkdir dizin1 dizin2 dizin3
Bu komut üç ayrı dizini aynı anda oluşturur. Basit ama işe yarayan bir özellik.
Önemli Seçenekler ve Parametreler
-p Seçeneği: İç İçe Dizin Yapıları
mkdir‘in en çok kullanılan ve en güçlü seçeneği -p (parents) parametresidir. Bu seçenek sayesinde arada olmayan üst dizinleri otomatik olarak oluşturabilirsiniz.
Örneğin şöyle bir yapı kurmak istiyorsunuz:
/var/www/projeler/eticaret/src/components
Bu yapıdaki hiçbir dizin henüz mevcut değil. Normalde bunu yapmak için altı ayrı mkdir komutu çalıştırmanız gerekir. -p ile tek satırda halledersiniz:
mkdir -p /var/www/projeler/eticaret/src/components
Bir de şu duruma dikkat edin: Eğer oluşturmaya çalıştığınız dizin zaten mevcutsa, -p seçeneği hata vermez. Sessizce geçer. Bu özellikle script yazarken hayat kurtarıcıdır.
# Bu komut iki kez çalıştırılsa da hata vermez
mkdir -p /tmp/test_dizini
mkdir -p /tmp/test_dizini # Hata yok, sessizce geçer
-m Seçeneği: İzin Ayarları
Dizin oluştururken doğrudan izinleri ayarlamak isterseniz -m (mode) seçeneğini kullanırsınız:
mkdir -m 755 web_dizini
mkdir -m 700 ozel_dizin
mkdir -m 777 paylasilan_dizin
Bu, mkdir sonrasında chmod çalıştırmaya göre daha temiz bir yaklaşımdır. Özellikle otomasyonda tek adımda hem oluşturup hem izin vermek büyük kolaylık sağlar.
-v Seçeneği: Verbose (Ayrıntılı) Çıktı
Script’lerinizde ne olduğunu takip etmek istiyorsanız -v kullanın:
mkdir -v yeni_klasor
# Çıktı: mkdir: created directory 'yeni_klasor'
Bu özellikle -p ile birlikte kullanıldığında hangi dizinlerin oluşturulduğunu görmek için harikadır:
mkdir -pv /opt/uygulama/logs/2024/ocak
# Çıktı:
# mkdir: created directory '/opt/uygulama'
# mkdir: created directory '/opt/uygulama/logs'
# mkdir: created directory '/opt/uygulama/logs/2024'
# mkdir: created directory '/opt/uygulama/logs/2024/ocak'
Gerçek Dünya Senaryoları
Senaryo 1: Web Sunucusu Proje Yapısı Kurma
Yeni bir web projesi için standart bir dizin yapısı oluşturmanız gerekiyor. Bunu tek bir mkdir komutuyla yapabilirsiniz:
mkdir -p /var/www/html/proje/{css,js,images,fonts,uploads,logs}
Burada süslü parantez genişletmesi (brace expansion) kullanıyoruz. Bu bash özelliği sayesinde proje dizini altında altı ayrı alt dizin tek komutla oluşturulur.
Daha karmaşık bir yapı için:
mkdir -p /var/www/html/eticaret/{public/{css,js,images},private/{config,logs,cache},src/{controllers,models,views}}
Bu komut şu yapıyı oluşturur:
eticaret/
├── public/
│ ├── css/
│ ├── js/
│ └── images/
├── private/
│ ├── config/
│ ├── logs/
│ └── cache/
└── src/
├── controllers/
├── models/
└── views/
Tek satır, saniyeler içinde kurumsal düzeyde bir dizin yapısı. Bu kadar temiz.
Senaryo 2: Log Arşivleme Yapısı
Sistem loglarını yıl/ay/gün bazında düzenlemek istiyorsunuz. Basit bir script ile bu yapıyı otomatik oluşturabilirsiniz:
#!/bin/bash
# Log dizin yapısını oluşturan script
YIL=$(date +%Y)
AY=$(date +%m)
GUN=$(date +%d)
LOG_BASE="/var/log/arsiv"
mkdir -p "$LOG_BASE/$YIL/$AY/$GUN"
if [ $? -eq 0 ]; then
echo "Log dizini başarıyla oluşturuldu: $LOG_BASE/$YIL/$AY/$GUN"
else
echo "Hata: Log dizini oluşturulamadı!" >&2
exit 1
fi
Bu script’i cron’a ekleyerek her gün otomatik çalıştırabilirsiniz:
# crontab -e ile ekleyin
0 0 * * * /opt/scripts/log_dizin_olustur.sh
Senaryo 3: Çoklu Kullanıcı Ev Dizini Kurulumu
Yeni bir sunucuya on kullanıcı ekleyeceksiniz ve her biri için standart bir ev dizini yapısı kurmanız gerekiyor:
#!/bin/bash
# Kullanıcı listesi
KULLANICILAR=("ahmet" "mehmet" "ayse" "fatma" "ali")
EV_DIZINI_BASE="/home"
for kullanici in "${KULLANICILAR[@]}"; do
# Temel dizin yapısını oluştur
mkdir -pv "$EV_DIZINI_BASE/$kullanici"/{belgeler,indirmeler,masaustu,muzik,videolar,.config,.local/share}
# Sahipliği ayarla
chown -R "$kullanici:$kullanici" "$EV_DIZINI_BASE/$kullanici"
# İzinleri ayarla
chmod 700 "$EV_DIZINI_BASE/$kullanici"
echo "[$kullanici] için ev dizini yapısı hazırlandı."
done
Bu tür toplu işlemlerde mkdir -p olmazsa olmazdır. Hata kontrolü yapmadan güvenle kullanabilirsiniz.
Senaryo 4: Yedekleme Dizin Yapısı
Profesyonel bir yedekleme sistemi kurarken dizin organizasyonu kritik önem taşır:
#!/bin/bash
# Yedekleme sistemi için dizin yapısı
YEDEK_KOKU="/mnt/yedekler"
SUNUCU_ADI=$(hostname)
TARIH=$(date +%Y-%m-%d)
# Temel yapıyı oluştur
mkdir -pm 750 "$YEDEK_KOKU/$SUNUCU_ADI/$TARIH"/{veritabani,dosyalar,konfigurasyon,log}
# Yedekleme scripti için çalışma dizini
mkdir -pm 700 /tmp/yedek_gecici
echo "Yedekleme dizin yapısı hazır:"
echo " Konum: $YEDEK_KOKU/$SUNUCU_ADI/$TARIH"
ls -la "$YEDEK_KOKU/$SUNUCU_ADI/$TARIH"
Burada -pm şeklinde iki seçeneği birleştirdiğimize dikkat edin. -p ve -m 750 beraber çalışarak hem yapıyı oluşturur hem de izinleri doğru ayarlar.
Umask ile İlişkisi
mkdir komutunun varsayılan olarak hangi izinlerle dizin oluşturduğu umask değerine bağlıdır. Bu önemli bir noktadır.
Linux’ta dizinlerin temel izni 777’dir. Umask bu değerden çıkarılarak gerçek izin hesaplanır:
# Mevcut umask değerini görün
umask
# Genellikle: 022
# 777 - 022 = 755 (rwxr-xr-x)
mkdir test_dizini
ls -ld test_dizini
# drwxr-xr-x 2 kullanici grup 4096 ...
Eğer -m seçeneğini kullanırsanız umask devre dışı kalır ve verdiğiniz izin doğrudan uygulanır:
mkdir -m 700 gizli_dizin
ls -ld gizli_dizin
# drwx------ 2 kullanici grup 4096 ...
Bu farkı anlamak güvenlik açısından son derece önemlidir. Özellikle paylaşımlı sistemlerde hassas verilerin bulunduğu dizinleri oluştururken -m ile izinleri açıkça belirtmek güvenli bir alışkanlıktır.
İleri Düzey Kullanım Örnekleri
Geçici Dizinler ve Güvenlik
Script’lerde geçici dizin oluştururken mktemp ile birlikte kullanmak güvenli bir yaklaşımdır:
# Güvenli geçici dizin oluşturma
GECICI_DIR=$(mktemp -d)
echo "Geçici dizin: $GECICI_DIR"
# İşlemler bittikten sonra temizleme
trap "rm -rf $GECICI_DIR" EXIT
Ama bazen geçici dizin konumunu siz belirlemek istersiniz:
GECICI_DIR="/tmp/script_$$" # $$ mevcut PID'i verir, benzersizlik sağlar
mkdir -m 700 "$GECICI_DIR"
Dizin Varlık Kontrolü ile Birlikte
Script’lerde sıkça kullanılan bir kalıp:
#!/bin/bash
DIZIN="/opt/uygulama/data"
if [ ! -d "$DIZIN" ]; then
mkdir -p "$DIZIN"
echo "Dizin oluşturuldu: $DIZIN"
else
echo "Dizin zaten mevcut: $DIZIN"
fi
Ancak bu kalıp yerine doğrudan mkdir -p kullanmak çoğu zaman daha temizdir, çünkü -p zaten var olan dizinler için hata vermez. Ama bazen oluşturulup oluşturulmadığını loglamamız gerekebilir, bu durumda if kontrolü mantıklıdır.
Sembolik Bağlantı ile Birlikte Kullanım
Gerçek dünyada sıkça karşılaştığım bir senaryo: Uygulama günlükleri için merkezi bir dizin yapısı kurmak ve sembolik bağlantıyla uygulamaya bağlamak:
# Merkezi log dizini oluştur
mkdir -p /var/log/uygulamalar/webapp/2024
# Uygulamanın beklediği yola sembolik bağlantı ver
ln -s /var/log/uygulamalar/webapp/2024 /opt/webapp/logs
Sık Yapılan Hatalar ve Çözümleri
Hata 1: İzin Reddedildi
mkdir /etc/yeni_dizin
# mkdir: cannot create directory '/etc/yeni_dizin': Permission denied
Çözüm: sudo kullanın ya da dizin oluşturmak için yeterli yetkiye sahip olduğunuzdan emin olun.
Hata 2: Dosya Zaten Var (Dizin Değil)
touch test
mkdir test
# mkdir: cannot create directory 'test': File exists
Çözüm: Aynı adda bir dosya var. -p bile bu durumda hata verir çünkü bir dosyayı dizine çeviremez.
Hata 3: Uzun Yol Bileşeninin Yokluğu
mkdir /var/www/proje/alt_dizin
# mkdir: cannot create directory '/var/www/proje/alt_dizin': No such file or directory
Çözüm: -p seçeneğini kullanın.
Pratik İpuçları
- Brace expansion ile zaman kazanın:
mkdir -p proje/{src,test,docs,build}gibi kullanımlar script’lerinizi hem kısaltır hem okunur kılar. - Script’lerde her zaman
-pkullanın: Zaten var olan dizinler için hata almamak otomasyon güvenilirliğini artırır. - İzinleri baştan belirleyin: Dizin oluşturma ve izin verme işlemini iki adıma ayırmak yerine
-mile tek seferde yapın. -vile debug edin: Script geliştirme aşamasında-vekleyerek ne yapıldığını takip edin, production’da kaldırın.- Sahiplik ayarını unutmayın:
mkdirsonrası sıkça yapılan hata, dizini root ile oluşturup sahipliği değiştirmeyi unutmaktır. Script’lerinizechowneklemeyi ihmal etmeyin.
Sonuç
mkdir komutu, görünürde en basit Linux komutlarından biridir. Ama doğru kullanıldığında sistem yönetimi scriptlerinin vazgeçilmez bir parçasına dönüşür. -p, -m ve -v seçeneklerini öğrenmek, brace expansion ile birleştirmek ve gerçek senaryolarda uygulamak bu komuttan maksimum verimi almanızı sağlar.
Özellikle otomasyon scriptleri yazarken mkdir -p kullanımını alışkanlık haline getirin. Hem hata toleransını artırır hem de kodunuzu daha temiz tutar. Dizin yapısı tasarımına özen gösterin; iyi organize edilmiş bir dizin hiyerarşisi, ilerleyen günlerde yönetim yükünüzü ciddi ölçüde azaltır.
Bir sonraki yazıda rmdir ve rm -r ile dizin silme işlemlerini ele alacağız. Takipte kalın.