cp Komutu: Dosya ve Dizin Kopyalama Komple Rehber
Gunluk sistem yonetimi islerinin belki de en sik kullanilan komutu cpdir. Basit gorunumune ragmen, dogru kullanildiginda hayat kurtarici bir aractir. Bu yazida cp komutunu en temel kullanimi ile baslayip ileri seviye senaryolara kadar ele alacagiz.
cp Nedir ve Neden Onemlidir?
cp (copy), Unix/Linux sistemlerinde dosya ve dizinleri kopyalamak icin kullanilan temel komut satirı aracıdır. Windows’taki copy veya xcopy komutlarinin karsiligi olarak dusunebilirsiniz ama cp cok daha guclüdür.
Neden bu kadar onemli? Cunku:
- Yedekleme islemlerinde kullanilir
- Yapilandirma dosyalarini duzenlemeden once kopya almak icin kullanilir
- Toplu dosya tasima ve kopyalama islemlerinde kullanilir
- Izin ve sahiplik koruyan kopyalar olusturmak icin kullanilir
Temel Kullanim
Sozdizimi cok basittir:
cp [SECENEKLER] KAYNAK HEDEF
En basit haliyle bir dosyayi kopyalamak:
cp dosya.txt yedek_dosya.txt
Bu komut dosya.txt dosyasini ayni dizinde yedek_dosya.txt adıyla kopyalar. Simdi gercek senaryolara gecelim.
Temel Secenekler ve Anlamlari
Sysadmin olarakgunluk hayatta kullanacaginiz secenekleri tek tek inceleyelim.
-r veya -R: Recursive (Dizinleri Kopyalama)
Dizin kopyalamak icin -r seçeneği zorunludur. Aksi halde cp hata verir.
cp -r /etc/nginx /backup/nginx_yedek
Bu komut /etc/nginx dizinini tum alt dizinleri ve dosyalari ile birlikte /backup/nginx_yedek altina kopyalar.
-p: Izinleri ve Zamanlari Koru
Bu secenek ozellikle yedekleme islerinde kritiktir. -p ile kopyalarken dosyanin:
- Sahip bilgisi (owner)
- Grup bilgisi (group)
- Izinleri (permissions)
- Zaman damgasi (timestamp) korunur.
cp -p onemli_config.conf /backup/onemli_config.conf
-i: Interaktif Mod (Uzerine Yazma Uyarisi)
Hedef dosya zaten varsa sizi uyarır ve onay ister. Ozellikle kritik sistemlerde cok isine yarar.
cp -i yeni_config.conf /etc/app/config.conf
Cikti:
cp: overwrite '/etc/app/config.conf'?
-v: Verbose (Ne Yaptigini Goster)
Toplu kopyalama islemlerinde hangi dosyanin kopyalandigini gormek isterseniz:
cp -rv /var/www/html /backup/web_yedek
Her kopyalanan dosya terminal ekranina yazilir. Buyuk dizinleri kopyalarken ne kadar ilerledigini takip etmek icin kullanislidir.
-u: Update (Sadece Yenileri Kopyala)
Hedef dosya kaynaktan daha yeniyse kopyalama yapmaz. Bu secenek artimsal (incremental) yedekleme benzeri senaryolarda cok ise yarar:
cp -u /kaynak/* /hedef/
-n: Uzerine Yazma
Hedef dosya mevcutsa hic dokunma:
cp -n dosya.txt /hedef/dosya.txt
Gercek Dunya Senaryolari
Senaryo 1: Nginx Konfigurasyonu Duzenlenmeden Once Yedek Al
Bir web sunucusunda nginx konfigurasyonunu guncelleyeceksiniz. Hata yaparsaniz geri donebilmek icin:
# Tarihi isme ekleyerek yedek al
cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date +%Y%m%d_%H%M%S)
# Kontrol edelim
ls -la /etc/nginx/nginx.conf*
Cikti boyle gorünür:
-rw-r--r-- 1 root root 2674 May 15 09:30 /etc/nginx/nginx.conf
-rw-r--r-- 1 root root 2674 May 15 09:30 /etc/nginx/nginx.conf.20240515_093045
Artik guvenle duzenleyebilirsiniz. Bir sey ters giderse:
cp /etc/nginx/nginx.conf.20240515_093045 /etc/nginx/nginx.conf
Senaryo 2: Web Sitesi Dosyalarini Yedekle
Bir uygulama guncellemesi yapacaksiniz ve /var/www/html altindaki tum dosyalari yedeklemek istiyorsunuz:
#!/bin/bash
TARIH=$(date +%Y%m%d_%H%M%S)
KAYNAK="/var/www/html"
HEDEF="/backup/web/$TARIH"
mkdir -p "$HEDEF"
cp -rp "$KAYNAK" "$HEDEF"
echo "Yedekleme tamamlandi: $HEDEF"
echo "Boyut: $(du -sh $HEDEF | cut -f1)"
-rp kombinasyonu burada kritik. -r ile dizinleri recursive kopyaliyoruz, -p ile de dosya izinlerini ve zaman damgalarini koruyoruz. Boylece geri yukleme yaptigimizda izin problemleri yasanmaz.
Senaryo 3: Birden Fazla Dosyayi Bir Dizine Kopyala
Ayni anda birden fazla dosyayi kopyalamak mumkun, bu cok kullanisli bir ozelliktir:
# Birden fazla konfigurasyonu yedek klasorüne kopyala
cp /etc/mysql/my.cnf /etc/php/php.ini /etc/redis/redis.conf /backup/configs/
Dikkat edin: Birden fazla kaynak varsa son arguman her zaman bir dizin olmak zorundadir.
Wildcard kullanimı da cok yaygindir:
# Tum .conf dosyalarini kopyala
cp /etc/app/*.conf /backup/app_configs/
# Belirli bir pattern
cp /var/log/nginx/access.log.* /backup/logs/
Senaryo 4: Disk Yavasligi Olan Ortamda Kopyalama
Buyuk dosyalari kopyalarken progress bar gormek isterseniz pv aracini cp ile birlestirabilirsiniz:
# pv kurulu degilse: apt install pv veya yum install pv
pv /kaynak/buyuk_dosya.iso > /hedef/buyuk_dosya.iso
# Dizinler icin rsync daha iyidir ama cp ile de trick var:
tar cf - /kaynak/dizin | pv | tar xf - -C /hedef/
Senaryo 5: Sembolik Linkleri Kopyalama
cp varsayilan olarak symbolic link’lerin gosterdigi dosyayi kopyalar, linkin kendisini degil. Eger linki oldugu gibi kopyalamak istiyorsaniz:
# Sembolik linki kopyala (linkin kendisi)
cp -P link_dosyasi.txt /hedef/
# Linkin gosterdigi dosyayi kopyala (varsayilan davranis)
cp link_dosyasi.txt /hedef/
Dikkat: Buyuk dizin kopyalamalarinda -r kullandigınizda sembolik linkler otomatik takip edilir. Bunu engellemek icin -d seçeneğini kullanin:
cp -rd /kaynak/dizin /hedef/dizin
Kopyalama Sirasinda Izinler Hakkinda Dikkat Edilecekler
Sistem yoneticilerinin en sik yaptigi hata, dosyalari kopyalarken izin bilgilerini kaybetmektir.
# YANLIS: Izinler kaybolabilir
cp /etc/sudoers /backup/sudoers_backup
# DOGRU: Izinleri koru
cp -p /etc/sudoers /backup/sudoers_backup
# Kopyalama sonrasi kontrol et
ls -la /backup/sudoers_backup
stat /backup/sudoers_backup
Ozellikle setuid ve setgid bitlerini iceren dosyalari kopyalarken cok dikkatli olun. Root olarak -p ile kopyalamak bu bitleri de korur, ama bazi durumlarda bu istenmeyen bir durum yaratabilir.
cp mi, rsync mi?
Bu soruyu cok aliyorum. Kisa cevap: kucuk, tek seferlik isler icin cp, buyuk ve tekrarlayan yedeklemeler icin rsync.
| Ozellik | cp | rsync | |—|—|—| | Basit dosya kopyalama | Ideal | Fazla karisik | | Ağ uzerinden kopyalama | Hayir | Evet | | Artimsal yedekleme | Sinirli | Mukemmel | | Progress gosterme | Zor | Kolay | | Bant genisligi kontrolu | Hayir | Evet |
Sik Yapilan Hatalar
Hata 1: Dizini Kopyalarken -r Unutmak
cp /etc/nginx /backup/
# cp: -r not specified; omitting directory '/etc/nginx'
Cozum:
cp -r /etc/nginx /backup/
Hata 2: Trailing Slash Karisikligi
# Bu iki komut FARKLI sonuc uretir!
# Birincisi: nginx klasorunu backup icine koyar
# Sonuc: /backup/nginx/...
cp -r /etc/nginx /backup/
# Ikincisi: nginx ICERIGINI backup icine koyar
# Sonuc: /backup/conf.d/... (nginx klasoru olusturulmaz)
cp -r /etc/nginx/ /backup/
Bu davranis cok kafa karistirici olabiliyor. Her zaman ne beklediginizi test edin.
Hata 3: Hedef Disk Dolu Iken Kopyalama
cp -r /buyuk/dizin /hedef/
# Yari yolda "No space left on device" hatasi
Once hedef diskte yer olup olmadigini kontrol edin:
df -h /hedef/
du -sh /buyuk/dizin/
Ileri Seviye: cp ile Bash Script Entegrasyonu
Gercek sistemlerde cp genellikle script’lerin parcasidir. Iste hata kontrollu bir ornek:
#!/bin/bash
# Guvenli kopyalama fonksiyonu
guvenli_kopyala() {
local KAYNAK="$1"
local HEDEF="$2"
# Kaynak var mi?
if [ ! -e "$KAYNAK" ]; then
echo "HATA: Kaynak bulunamadi: $KAYNAK"
return 1
fi
# Hedef dizin var mi? Yoksa olustur
local HEDEF_DIZIN=$(dirname "$HEDEF")
if [ ! -d "$HEDEF_DIZIN" ]; then
mkdir -p "$HEDEF_DIZIN" || {
echo "HATA: Hedef dizin olusturulamadi: $HEDEF_DIZIN"
return 1
}
fi
# Kopyala
if cp -rp "$KAYNAK" "$HEDEF"; then
echo "BASARILI: $KAYNAK --> $HEDEF"
return 0
else
echo "HATA: Kopyalama basarisiz!"
return 1
fi
}
# Kullanim
guvenli_kopyala "/etc/nginx" "/backup/nginx_$(date +%Y%m%d)"
guvenli_kopyala "/etc/mysql/my.cnf" "/backup/configs/my.cnf"
Hizli Referans Tablosu
| Komut | Ne Yapar | |—|—| | cp dosya.txt yedek.txt | Temel dosya kopyalama | | cp -r dizin/ /hedef/ | Dizin kopyalama | | cp -p dosya /hedef/ | Izinleri koruyarak kopyalama | | cp -i dosya /hedef/ | Uzerine yazmadan once sor | | cp -v dosya /hedef/ | Islemi ekranda goster | | cp -u kaynak/ hedef/ | Sadece yeni dosyalari kopyala | | cp -rp dizin/ /hedef/ | Dizin + izin koruma | | cp -n dosya /hedef/ | Varsa uzerine yazma | | cp dosya{,.bak} | Ayni dizinde yedek al |
Son satirda bash brace expansion kullanilmis, cok pratik bir teknik:
# /etc/nginx/nginx.conf dosyasinin nginx.conf.bak kopyasini ayni yerde olustur
cp /etc/nginx/nginx.conf{,.bak}
Sonuc
cp komutu, gorunurde basit bir arac gibi dursa da dogru seceneklerle kullanildiginda sistem yonetiminin vazgecilmez bir parcasidir. Ozellikle unuttugumda is basinda cok kez “keske -p kullanseydim” dedigim oldu, o yuzden konfigürasyon dosyalarini kopyalarken -p yi adeta bir refleks haline getirin.
Ozetlemek gerekirse:
- Konfigürasyon yedegi alirken her zaman
cp -pkullanin - Dizin kopyalarken
-rve cogunlukla-pkombinasyonunu tercih edin - Kritik dosyalarda
-iile uzerine yazma uyarisini aktif edin - Toplu islemlerde
-vile neler oldugunu gozlemleyin - Tekrarlayan ve buyuk yedeklemeler icin
rsynce gecin
Komutlari pratikte deneyip kendi is akisınıza uygun kombinasyonları bulmak, uzun vadede en dogru yaklasimdir. Linux’ta ogrenmenin en iyi yolu her zaman yaparak ogrenme olmustur.