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.