Efe ÇİFTCİ

Bilgisayar Mühendisi, Özgür Yazılımcı, Trekkie.

Saklı Dosyaların Geçmişine Dair… 20 Şubat 2014


Unix ve Unix benzeri işletim sistemlerinde adı nokta işaretiyle (.) başlayan dosya ve dizinler saklı olarak kabul görüyor. Yani örneğin Masaüstü, Belgeler gibi dizinler ile rapor.odt, tatil_fotoğrafı.jpg gibi dosyalar normal dosya ve dizin olarak kabul edilirken .config gibi dizin ve .bashrc gibi dosyalar adları nokta karakteri ile başladıkları için saklı olarak sayılıyorlar. Saklı dosya ve dizinler herhangi bir parametre olmadan ls komutu ile görüntülenemezken ls -a ile görüntülenebiliyorlar.

1-2 gün önce okuduğum bir yazıda bu dosyaların niçin saklı dosya sayıldıklarını açıklayan ilginç bir açıklama anlatılıyordu. Şöyle ki; Unix işletim sisteminin ilk çıktığı yıllarda Unix’te kullanılan dosya sistemi de henüz emekleme aşamasındaydı. İlk sürümlerde henüz dizin tanımı yer almıyorken (yani hiç bir dizin olmadan tüm dosyalar yanyana) ilerleyen sürümlerde hiyerarşik dosya sistemi yapısı geliştirilmiş ve dizin kavramı devreye girmiş. Tabi biliyoruz ki dizinlerle çalışırken iki tane de özel dizin karşımıza çıkıyor: . (nokta) şu an içinde bulunduğumuz dizine işaret ederken .. (nokta nokta) bir üst dizini işaret eder. Mesela içinde bulunduğumuz bir dizindeki programı çalıştırmak için ./program komutunu çalıştırırken bir üst dizine dönmek için cd .. komutunu çalıştırıyoruz.

. ve .. dizinlerini geliştirdikten sonra ls komutu çalıştırıldığında bunların görünmemesini istemişler ve bu amaç doğrultusunda şöyle bir C kodu yazmışlar:

if (name[0] == '.') continue;

C programlama dilini kullanan insanların rahatlıkla görebileceği gibi bu komut, bir dosya adının ilk karakterinin nokta olup olmadığını, eğer nokta ise işlem yapılmadan geçileceğini belirtiyor. Tabi bu kontrol sayesinde . ve .. dizinlerinin atlanması sağlanırken insanlar .dosya gibi isimler verebilecekleri dosyaların da ls tarafından atlanabileceğini keşfediyor; bu sayede de aslında bir bug nedeniyle (bkz: it’s not a bug, it’s a feature) saklı dosya kavramı doğmuş oluyor.

Aslında eğer yukarıdaki if kontrolü yerine aşağıdaki if kontrolü yapılmış olsaydı günümüzde Unix ve Unix benzeri işletim sistemlerinde saklı dosya tanımı nasıl yapılmış olurdu merak ediyorum 🙂

if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;

Kaynak: https://plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp