← Bash tools
TEKNİK REHBER BASH TOOLS DOSYA KEŞFI 2026

which, type, locate
komutları ve dosyaları bul

"Bu komut nerede?", "Bu alias mı yoksa binary mi?" ve "Bu dosya sistemde var mı?" sorularına yanıt veren araçlar. Ayrıca realpath, basename, dirname ile yol manipülasyonu.

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çSoruKullanım
whichBu komutun binary'si nerede?PATH'de arar
whereisBinary, man ve kaynak nerede?Standart konumları tarar
typeBu komut ne tür bir komut?Alias/builtin/function/binary ayırt eder
locateBu dosya sistemde var mı?Önceden hazırlanmış DB ile hızlı
findBelirli kriterlere uyan dosyalar?Gerçek zamanlı arama
realpathBu yolun gerçek mutlak yolu ne?Sembolik linkleri çözer
basenameYolun dosya adı kısmı ne?Yol ayrıştırma
dirnameYolun 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.

bash
# 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 -a
PATH'deki tüm eşleşmeleri listele
whereis -b
Sadece binary konumu
whereis -m
Sadece man sayfası konumu
whereis -s
Sadece kaynak kodu konumu
which ALIAS'LARI GÖRMEZ

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.

bash
# 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
-t
Kısa tür: alias, builtin, function, file, keyword
-a
Tüm eşleşmeleri listele (alias + binary)
-P
Alias/function'ı atla, sadece PATH'deki binary'yi göster
command -v ÖNERİSİ

Betiklerde 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.

bash
# 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
-i
Büyük/küçük harf duyarsız
-r REGEX
Regex ile arama
-n N
En fazla N sonuç göster
-e
Sadece gerçekten var olan dosyaları göster
-c
Eşleşme sayısını göster (dosya listesi değil)
locate DB GECİKMESİ

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.

bash
# 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
--canonicalize-existing
Dosya yoksa hata ver
--canonicalize-missing
Dosya olmasa da mutlak yolu hesapla
--relative-to=DIR
Belirtilen dizine göreli yol hesapla
readlink -f
Tüm sembolik linkleri özyinelemeli çöz

05 basename ve dirname: yol parçalama

Yoldan dosya adını veya dizin kısmını ayıklamak için en temiz yol.

bash
# 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
basename YOLU [SONEK]
Son bileşeni al; isteğe bağlı son ek (uzantı) kaldır
basename -s SONEK YOLU
Son eki kaldır (-s flag ile)
dirname YOLU
Dizin kısmını al
SHELL EXPANSION ALTERNATİFİ

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.

bash — Betik: bağımlılık kontrolü
#!/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
bash — Betik kendini nerede biliyor?
#!/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
bash — Toplu dosya yeniden adlandırma
# 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
bash — Python versiyonu bul
# 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örmez
  • type ls: gerçek tür (alias/builtin/function/file) — which'ten güvenilir
  • command -v: betiklerde komut varlığı için POSIX uyumlu yol
  • locate -e nginx: hızlı arama ama DB güncel olmayabilir
  • updatedb: locate veritabanını güncelle (root gerekir)
  • realpath "$0": betik içinde betiğin gerçek yolu
  • basename "$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