touch Komutu: Linux’ta Dosya Oluşturma ve Zaman Damgası Değiştirme

Linux’ta en sık kullanılan komutlardan biri olan touch, göründüğünden çok daha güçlü bir araçtır. Çoğu sysadmin sadece boş dosya oluşturmak için kullanır ama aslında zaman damgası yönetimi, otomasyon scriptleri ve çeşitli sistem görevleri için vazgeçilmez bir komuttur. Bu yazıda touch komutunu her açıdan ele alacağız.

touch Komutu Nedir?

touch, temelde iki işlevi olan bir komuttur: var olmayan bir dosya oluşturmak ve var olan bir dosyanın zaman damgasını güncellemek. Adı biraz yanıltıcı olabilir, “dokunmak” anlamına gelir ve tam olarak bunu yapar — bir dosyaya dokunur, ya onu yoktan var eder ya da mevcut dosyanın metadata bilgilerini günceller.

Sistem yönetimi açısından düşündüğünde touch şu senaryolarda kritik rol oynar:

  • Cron job’lar için kilit (lock) dosyaları oluşturma
  • Log rotasyonu sonrası yeni log dosyaları hazırlama
  • Derleme sistemlerinde (make gibi) dosya bağımlılıklarını simüle etme
  • Backup scriptlerinde referans zaman damgası oluşturma
  • Test ortamlarında toplu dosya oluşturma

Temel Kullanım

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

touch dosya.txt

Bu komut dosya.txt adında boş bir dosya oluşturur. Eğer dosya zaten varsa, içeriğine dokunmaz sadece zaman damgasını günceller. Bu önemli bir nokta — touch mevcut dosyanın içeriğini silmez.

# Birden fazla dosya aynı anda oluşturma
touch dosya1.txt dosya2.txt dosya3.txt

# Brace expansion ile toplu dosya oluşturma
touch rapor_{Ocak,Subat,Mart,Nisan}.txt

# Sayısal döngü ile dosya oluşturma
touch log_{1..10}.txt

İkinci örnekte rapor_Ocak.txt, rapor_Subat.txt, rapor_Mart.txt ve rapor_Nisan.txt dosyaları tek komutla oluşturulur. Üçüncü örnekte ise log_1.txt‘den log_10.txt‘ye kadar 10 dosya oluşturulur. Toplu işlemlerde bu söz dizimi inanılmaz zaman kazandırır.

Zaman Damgası Türleri

Linux’ta her dosyanın üç tür zaman damgası vardır:

  • atime (access time): Dosyaya en son erişildiği zaman
  • mtime (modification time): Dosyanın içeriğinin en son değiştirildiği zaman
  • ctime (change time): Dosyanın metadata’sının (izinler, sahiplik vb.) en son değiştirildiği zaman

stat komutuyla bu bilgileri görebilirsin:

stat dosya.txt

Çıktı şuna benzer:

  File: dosya.txt
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd01h/64769d	Inode: 1234567     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  kullanici)   Gid: ( 1000/  kullanici)
Access: 2024-01-15 10:30:00.000000000 +0300
Modify: 2024-01-15 10:30:00.000000000 +0300
Change: 2024-01-15 10:30:00.000000000 +0300

touch Parametreleri

-a Parametresi: Sadece Erişim Zamanını Güncelle

touch -a dosya.txt

Bu komut yalnızca atime değerini günceller, mtime değişmez. Log dosyalarını analiz ederken veya dosya erişim istatistiklerini takip ederken işe yarar.

-m Parametresi: Sadece Değiştirilme Zamanını Güncelle

touch -m dosya.txt

Yalnızca mtime değerini günceller. Derleme sistemlerinde bir dosyanın “değişmiş gibi görünmesini” sağlamak için sıkça kullanılır.

-t Parametresi: Belirli Bir Zaman Damgası Ayarla

Belki de en güçlü parametrelerinden biri. Dosyanın zaman damgasını istediğin bir tarihe ayarlayabilirsin:

# Format: [[CC]YY]MMDDhhmm[.ss]
touch -t 202401151430.00 dosya.txt

Bu komut dosyanın zaman damgasını 15 Ocak 2024, saat 14:30:00 olarak ayarlar.

Parametre formatı şu şekilde:

  • CC: Yüzyıl (opsiyonel)
  • YY: Yılın son iki hanesi (opsiyonel)
  • MM: Ay (01-12)
  • DD: Gün (01-31)
  • hh: Saat (00-23)
  • mm: Dakika (00-59)
  • .ss: Saniye (opsiyonel, nokta ile başlar)

-d Parametresi: İnsan Okunabilir Tarih Formatı

-t parametresine göre çok daha esnek ve okunabilir:

touch -d "2024-01-15 14:30:00" dosya.txt
touch -d "yesterday" dosya.txt
touch -d "last monday" dosya.txt
touch -d "2 hours ago" dosya.txt
touch -d "next friday" dosya.txt
touch -d "1 month ago" dosya.txt

-d parametresi GNU date komutunun anlayabildiği her türlü formatı kabul eder. Bu esneklik özellikle scriptlerde çok işe yarar.

-r Parametresi: Başka Bir Dosyanın Zaman Damgasını Kopyala

touch -r kaynak_dosya.txt hedef_dosya.txt

kaynak_dosya.txt‘nin zaman damgasını alır ve hedef_dosya.txt‘ye uygular. Dosya kopyalama işlemlerinde orijinal zaman damgasını korumak istediğinde veya iki dosyanın zaman damgasını senkronize etmen gerektiğinde kullanılır.

-c Parametresi: Yeni Dosya Oluşturma

touch -c var_olmayan_dosya.txt

Normalde touch var olmayan bir dosyayı otomatik oluşturur. -c (veya --no-create) parametresi bu davranışı engeller — dosya yoksa hiçbir şey yapmaz. Sadece mevcut dosyaların zaman damgasını güncellemek istediğinde kullanılır.

Gerçek Dünya Senaryoları

Senaryo 1: Cron Job Kilit Dosyası (Lock File)

Uzun süren bir cron job’ın aynı anda birden fazla kez çalışmasını engellemek için kilit dosyası mekanizması kullanılır:

#!/bin/bash

LOCK_FILE="/tmp/yedekleme.lock"

# Kilit dosyası var mı kontrol et
if [ -f "$LOCK_FILE" ]; then
    echo "Yedekleme zaten çalışıyor, çıkılıyor..."
    exit 1
fi

# Kilit dosyasını oluştur
touch "$LOCK_FILE"

# Temizlik için trap ayarla
trap "rm -f $LOCK_FILE" EXIT

echo "Yedekleme başlıyor..."
# ... yedekleme işlemleri ...
sleep 30

echo "Yedekleme tamamlandı."
# trap EXIT sayesinde kilit dosyası otomatik silinir

Bu senaryoda touch ile oluşturulan kilit dosyası, paralel çalışmayı engeller. trap komutu sayesinde script normal veya anormal şekilde çıksa bile kilit dosyası temizlenir.

Senaryo 2: Make Sisteminde Zorla Derleme

make komutu dosyaların zaman damgalarına bakarak hangisinin derlenmesi gerektiğine karar verir. Bazen tüm dosyaları yeniden derlemek isteyebilirsin:

# Tek bir kaynak dosyasını "değiştirilmiş" göster
touch src/main.c

# Tüm C dosyalarını yeniden derlemeye zorla
find . -name "*.c" -exec touch {} ;

# Alternatif: xargs ile daha hızlı
find . -name "*.c" | xargs touch

# make'i çalıştır
make

Bu teknik özellikle header dosyası değişikliklerini takip etmesi gereken karmaşık projelerde kullanışlıdır.

Senaryo 3: Log Rotasyonu Sonrası Dosya Hazırlama

#!/bin/bash

LOG_DIR="/var/log/uygulamam"
DATE=$(date +%Y%m%d)

# Eski log dosyasını arşivle
if [ -f "${LOG_DIR}/uygulama.log" ]; then
    mv "${LOG_DIR}/uygulama.log" "${LOG_DIR}/uygulama_${DATE}.log"
    gzip "${LOG_DIR}/uygulama_${DATE}.log"
fi

# Yeni boş log dosyasını doğru izinlerle oluştur
touch "${LOG_DIR}/uygulama.log"
chown www-data:www-data "${LOG_DIR}/uygulama.log"
chmod 640 "${LOG_DIR}/uygulama.log"

# Uygulamayı log dosyasını yeniden açmaya zorla (SIGHUP)
systemctl reload uygulamam

echo "Log rotasyonu tamamlandı: $(date)"

Senaryo 4: Yedekleme Referans Noktası

Incremental (artımlı) yedekleme scriptlerinde en son yedekleme zamanını takip etmek için touch kullanılır:

#!/bin/bash

BACKUP_DIR="/backup"
SOURCE_DIR="/var/www"
TIMESTAMP_FILE="${BACKUP_DIR}/.son_yedekleme"

# İlk çalışmada veya timestamp yoksa full backup al
if [ ! -f "$TIMESTAMP_FILE" ]; then
    echo "İlk yedekleme, tüm dosyalar kopyalanıyor..."
    rsync -av "${SOURCE_DIR}/" "${BACKUP_DIR}/tam/"
else
    echo "Artımlı yedekleme yapılıyor..."
    # Son yedeklemeden bu yana değişen dosyaları bul
    find "${SOURCE_DIR}" -newer "$TIMESTAMP_FILE" -type f | while read dosya; do
        echo "Değişti: $dosya"
        rsync -av "$dosya" "${BACKUP_DIR}/artimli/"
    done
fi

# Yedekleme zamanını güncelle
touch "$TIMESTAMP_FILE"
echo "Yedekleme tamamlandı: $(date)"

Bu scriptte $TIMESTAMP_FILE bir referans noktası görevi görür. find -newer komutu bu dosyadan daha yeni olan tüm dosyaları listeler.

Senaryo 5: Test Ortamı Dosya Yapısı Hazırlama

Geliştirme veya test ortamı kurarken toplu dosya yapısı oluşturmak gerekebilir:

#!/bin/bash

# Proje dizin yapısını oluştur
mkdir -p proje/{src,tests,docs,config,logs}

# Temel dosyaları oluştur
touch proje/src/{main.py,utils.py,models.py,__init__.py}
touch proje/tests/{test_main.py,test_utils.py,__init__.py}
touch proje/docs/{README.md,CHANGELOG.md,API.md}
touch proje/config/{development.conf,production.conf,test.conf}
touch proje/logs/{app.log,error.log,access.log}

# .gitignore ve requirements dosyaları
touch proje/{.gitignore,requirements.txt,setup.py}

echo "Proje yapısı oluşturuldu:"
find proje -type f | sort

Bu script saniyeler içinde eksiksiz bir proje iskelet yapısı kurar.

İleri Seviye Kullanım Teknikleri

Gelecek veya Geçmiş Tarih Atama

Bazı durumlarda (arşivleme, test senaryoları, uyumluluk gereksinimleri) dosyalara gerçek tarihleri dışında tarih ataman gerekebilir:

# 6 ay önceki tarihi ata
touch -d "6 months ago" arsiv_dosyasi.txt

# Gelecek bir tarih ata
touch -d "2025-12-31 23:59:59" planlama.txt

# Unix timestamp kullanarak tarih ata
touch -d @1705312200 dosya.txt

# Belirli bir yıla ait gibi görünen dosya
touch -t 202001010000.00 eski_kayit.txt

find ile Kombinasyon

# 30 günden eski log dosyalarını bul ve zaman damgasını güncelle
find /var/log -name "*.log" -mtime +30 -exec touch -m {} ;

# Belirli dizindeki tüm Python dosyalarını "şimdi değiştirilmiş" yap
find /proje/src -name "*.py" | xargs touch

# Sadece belirli boyutun altındaki dosyaların zaman damgasını güncelle
find . -maxdepth 1 -type f -size -1k -exec touch {} ;

Sembolik Link Davranışı

touch komutunun sembolik linklerle davranışı dikkat gerektirir:

# Sembolik link oluştur
ln -s gercek_dosya.txt link_dosya.txt

# touch sembolik linkin kendisini değil, hedef dosyayı günceller
touch link_dosya.txt

# Sembolik linkin kendisinin zaman damgasını güncellemek için -h kullan
touch -h link_dosya.txt

Not: -h parametresi her Linux dağıtımında aynı şekilde çalışmayabilir, kullanmadan önce man touch ile doğrula.

touch vs Diğer Yöntemler

touch dışında da dosya oluşturmanın yolları var, aralarındaki farkları bilmek önemli:

  • > dosya.txt: Dosyayı oluşturur ama eğer varsa içeriğini siler. touch kullanırsan içerik korunur.
  • echo "" > dosya.txt: Dosyayı oluşturur ve içine newline yazar, yani tamamen boş değil. touch ile oluşturulan dosya gerçekten 0 byte’tır.
  • cat /dev/null > dosya.txt: Var olan dosyanın içeriğini boşaltır ama zaman damgasını da günceller, dikkatli kullan.
  • install -m 644 /dev/null dosya.txt: Dosyayı belirtilen izinlerle oluşturur. touch izin belirleyemez, oluşturma sonrası chmod gerekir.

Performans Notu

Çok sayıda dosya üzerinde touch çalıştırırken yönteme dikkat et:

# Yavaş yöntem: Her dosya için ayrı touch process başlatır
find . -name "*.txt" -exec touch {} ;

# Hızlı yöntem: Tek touch process ile tüm dosyaları işler
find . -name "*.txt" | xargs touch

# Daha hızlı: null terminator ile boşluk içeren dosya adlarını da destekler
find . -name "*.txt" -print0 | xargs -0 touch

Binlerce dosya söz konusu olduğunda xargs kullanımı ciddi hız farkı yaratır çünkü -exec her dosya için ayrı bir process oluşturur.

Yaygın Hatalar ve Çözümleri

Hata: İzin reddedildi

touch /etc/yeni_dosya.txt
# touch: cannot touch '/etc/yeni_dosya.txt': Permission denied

# Çözüm: sudo kullan
sudo touch /etc/yeni_dosya.txt

Hata: Dizin yok

touch /mevcut/olmayan/dizin/dosya.txt
# touch: cannot touch '...': No such file or directory

# Çözüm: Önce dizini oluştur
mkdir -p /mevcut/olmayan/dizin && touch /mevcut/olmayan/dizin/dosya.txt

Hata: Disk dolu

touch yeni_dosya.txt
# touch: cannot touch 'yeni_dosya.txt': No space left on device

# Kontrol et
df -h .

Sonuç

touch komutu basit görünüşünün aksine sistem yönetiminin pek çok köşesinde karşına çıkar. Boş dosya oluşturmanın ötesinde kilit mekanizmaları, artımlı yedekleme referans noktaları, derleme sistemi manipülasyonu ve toplu dosya yönetimi gibi kritik görevlerde kullanılır.

En sık kullanacağın parametreler muhtemelen -d (insanın okuyabileceği tarih formatıyla zaman damgası), -r (başka dosyadan zaman damgası kopyalama) ve -c (sadece mevcut dosyaları güncelle) olacak. Bu üçünü iyi anlarsan touch komutunun kapasitesini gerçekten kullanıyor olursun.

Scriptlerinde touch kullandığında her zaman şunu aklında tut: mevcut dosya varsa içeriğini korur, yoksa oluşturur. Bu davranış genellikle istediğin şeydir ama -c ile bu varsayılanı değiştirebilirsin. find -newer ile kombinasyonu ise özellikle artımlı işlemler gerektiren her türlü otomasyon scriptinde çok işe yarar.

Temel görevi basit olsa da touch‘ı hakkıyla öğrenmek, yazdığın bash scriptlerini hem daha temiz hem de daha güvenilir yapar.

Yorum yapın