00 Araçların rolleri
Komut ve dosya konumunu bulmak için birbirini tamamlayan araçlar — hangisini ne zaman kullanacağınızı bilmek önemli.
| Araç | Soru | Kullanım |
|---|---|---|
which | Bu komutun binary'si nerede? | PATH'de arar |
whereis | Binary, man ve kaynak nerede? | Standart konumları tarar |
type | Bu komut ne tür bir komut? | Alias/builtin/function/binary ayırt eder |
locate | Bu dosya sistemde var mı? | Önceden hazırlanmış DB ile hızlı |
find | Belirli kriterlere uyan dosyalar? | Gerçek zamanlı arama |
realpath | Bu yolun gerçek mutlak yolu ne? | Sembolik linkleri çözer |
basename | Yolun dosya adı kısmı ne? | Yol ayrıştırma |
dirname | Yolun dizin kısmı ne? | Yol ayrıştırma |
01 which ve whereis
which PATH'de ilk bulunan çalıştırılabilir dosyanın konumunu verir. whereis binary, man sayfası ve kaynak kodunu birden arar.
# Komutun tam yolunu bul
which python3
/usr/bin/python3
which git
/usr/bin/git
# Tüm eşleşmeleri göster (PATH'de birden fazla varsa)
which -a python3
/usr/bin/python3
/usr/local/bin/python3
# Komut bulunamazsa hata kodu 1
which komut_yoktur; echo "Çıkış: $?"
Çıkış: 1
# Betiklerde kullanım: komut var mı?
if ! which jq >/dev/null 2>&1; then
echo "jq bulunamadı, kurun"
exit 1
fi
# whereis: binary + man + kaynak
whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
whereis -b python3 # sadece binary
whereis -m curl # sadece man sayfası
which ls sonucuna güvenmeyin — eğer ls'i alias etmişseniz (örn: alias ls='ls --color=auto'), which ls yine de /usr/bin/ls gösterir. Alias dahil gerçek davranışı görmek için type ls kullanın.
02 type: komutun gerçek doğası
type bir bash yerleşiği (builtin) olup komutun alias, function, builtin veya external binary olduğunu söyler. which'ten daha doğru.
# Komutun türü
type ls
ls is aliased to `ls --color=auto'
type cd
cd is a shell builtin
type grep
grep is /usr/bin/grep
type myfunction
myfunction is a function
# Kısa format (sadece tür)
type -t ls
alias
type -t cd
builtin
type -t grep
file
# Tüm eşleşmeleri göster (alias + binary)
type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
# Betiklerde: komut var mı? (type tercih edilir)
if ! type -t docker >/dev/null 2>&1; then
echo "Docker bulunamadı"
fi
# command -v: POSIX uyumlu alternatif (betikler için önerilir)
command -v python3
/usr/bin/python3
if command -v jq >/dev/null 2>&1; then
echo "jq mevcut"
fi
alias, builtin, function, file, keywordBetiklerde komut varlığını kontrol etmek için command -v komut >/dev/null 2>&1 en taşınabilir yoldur — POSIX uyumlu ve tüm kabuklarda çalışır. which sisteme göre davranış farklılıkları gösterebilir.
03 locate: hızlı dosya bulma
locate önceden oluşturulmuş veritabanında arama yapar — find'dan çok daha hızlı ama veritabanı güncel olmayabilir.
# Dosya adında "nginx" geçen her şeyi bul
locate nginx
/etc/nginx
/etc/nginx/nginx.conf
/usr/sbin/nginx
# Büyük/küçük harf duyarsız arama
locate -i nginx
# Regex ile arama
locate -r '/etc/.*\.conf$'
# Sonuç sayısını sınırla
locate -n 10 nginx
# Sadece var olan dosyaları göster (DB eski olabilir)
locate -e nginx.conf
# Veritabanını güncelle (root gerekir)
sudo updatedb
# locate yoksa find alternatifi
find / -name 'nginx.conf' 2>/dev/null
locate genellikle günde bir kez güncellenen (updatedb) veritabanını kullanır. Yeni oluşturduğunuz dosyayı bulamayabilir. Gerçek zamanlı arama için find kullanın. locate -e en azından silinen dosyaları filtreler.
04 realpath ve readlink: yol çözme
realpath sembolik linkleri çözerek mutlak yolu verir. Betiklerde $0'ın gerçek konumunu bulmak için vazgeçilmez.
# Göreli yolu mutlak yola çevir
realpath ../etc/passwd
/etc/passwd
# Sembolik linki çöz
realpath /etc/localtime
/usr/share/zoneinfo/Europe/Istanbul
# readlink: sadece link hedefini göster (çözmez)
readlink /etc/localtime
../usr/share/zoneinfo/Europe/Istanbul
# readlink -f: zincirleri de çöz (realpath gibi)
readlink -f /etc/localtime
/usr/share/zoneinfo/Europe/Istanbul
# Script'in kendi dizinini bul (betik içinde)
SCRIPT_DIR=$(dirname "$(realpath "$0")")
echo "Betik dizini: $SCRIPT_DIR"
# Dosyanın var olduğunu doğrula
realpath --canonicalize-existing dosya.txt # yoksa hata
realpath --canonicalize-missing dosya.txt # olmasa da hesapla
05 basename ve dirname: yol parçalama
Yoldan dosya adını veya dizin kısmını ayıklamak için en temiz yol.
# basename: yolun son bileşeni
basename /etc/nginx/nginx.conf
nginx.conf
# Uzantıyı kaldır
basename /path/to/dosya.tar.gz .tar.gz
dosya
basename -s .txt dosya.txt
dosya
# dirname: yolun dizin kısmı
dirname /etc/nginx/nginx.conf
/etc/nginx
dirname /etc/nginx/
/etc
# Birlikte kullanım: betik içinde
DOSYA="/opt/myapp/config/app.yaml"
echo "Dosya adı: $(basename "$DOSYA")"
echo "Dizin : $(dirname "$DOSYA")"
echo "Ad (ext'siz): $(basename "$DOSYA" .yaml)"
Dosya adı: app.yaml
Dizin : /opt/myapp/config
Ad (ext'siz): app
# Shell parameter expansion ile aynısı (harici komut gerekmez)
DOSYA="/opt/myapp/config/app.yaml"
echo "${DOSYA##*/}" # basename: app.yaml
echo "${DOSYA%/*}" # dirname: /opt/myapp/config
echo "${DOSYA##*/}" # dosya adı: app.yaml
ADSIZ="${DOSYA##*/}"
echo "${ADSIZ%.*}" # uzantısız: app
-s flag ile)Betiklerde yoğun döngülerde harici process çağrısı yavaştır. ${var##*/} (basename) ve ${var%/*} (dirname) shell'in yerleşik string işlemi olduğu için çok daha hızlıdır — özellikle 1000+ dosyalı döngülerde fark göze çarpar.
06 Pratik vakalar
Gerçek betiklerden örnekler.
#!/bin/bash
# Gerekli araçları kontrol et, eksikleri bildir
REQUIRED="curl jq git docker kubectl"
MISSING=""
for cmd in $REQUIRED; do
if ! command -v "$cmd" >/dev/null 2>&1; then
MISSING="$MISSING $cmd"
fi
done
if [ -n "$MISSING" ]; then
echo "Eksik araçlar:$MISSING"
exit 1
fi
#!/bin/bash
# Betik nerede olursa olsun, kendi dizinini bulur
SCRIPT_DIR=$(dirname "$(realpath "$0")")
# Config dosyasını betikle aynı dizinde ara
CONFIG="$SCRIPT_DIR/config.yaml"
if [ -f "$CONFIG" ]; then
echo "Config: $CONFIG"
fi
# Her dosya için uzantısız adı al, yeniden düzenle
for f in photos/*.jpg; do
name=$(basename "$f" .jpg)
dir=$(dirname "$f")
newname="2026-01-${name}.jpg"
mv "$f" "$dir/$newname"
done
# Hangi python kullanılıyor?
which python3
python3 --version
# PATH'deki tüm python3'leri listele
which -a python3
# Sembolik link mi?
ls -la $(which python3)
realpath $(which python3) # gerçek binary nerede?
Hatırlanacaklar
which: PATH'deki binary konumu — alias'ları görmeztype ls: gerçek tür (alias/builtin/function/file) —which'ten güvenilircommand -v: betiklerde komut varlığı için POSIX uyumlu yollocate -e nginx: hızlı arama ama DB güncel olmayabilirupdatedb: locate veritabanını güncelle (root gerekir)realpath "$0": betik içinde betiğin gerçek yolubasename "$f" .txt: uzantısız dosya adı${var##*/}ve${var%/*}: basename/dirname'nin hızlı shell alternatifi
Devam: find — dosya sistemi sorguları · ls, cp, mv, rm — temel dosya işlemleri