Linux’ta günlük sistem yönetimi işlerinin büyük bir kısmı dosya ve dizin kopyalama üzerine kuruludur. Yedek almak, konfigürasyon dosyası oluşturmak, kullanıcı home dizinlerini taşımak… Bunların hepsinde cp komutu devreye girer. Kulağa basit gelebilir ama cp‘nin ince ayarlarını bilmeden ciddi hatalar yapabilirsiniz. Üzerine yazdığınız dosyalar, eksik kopyaladığınız dizinler, bozulan izinler… Bunların hepsinin önüne geçmek için bu rehberi yazdım.
cp Komutu Nedir ve Neden Önemlidir?
cp (copy), Unix/Linux sistemlerde dosya ve dizinleri kopyalamak için kullanılan temel komuttur. Aslında son derece sade bir iş yapıyor gibi görünse de içinde onlarca parametre barındırır. Bir sysadmin olarak cp‘yi sadece cp kaynak hedef şeklinde kullanıyorsanız, masanın altında kalan çok şey var demektir.
cp komutu şu temel görevler için kullanılır:
- Tek bir dosyayı başka bir konuma kopyalamak
- Birden fazla dosyayı bir dizine kopyalamak
- Dizinleri alt dizinleriyle birlikte kopyalamak (recursive)
- Dosya izinlerini, zaman damgalarını ve sahiplik bilgilerini koruyarak kopyalamak
- Kopyalama öncesinde var olan dosyaların üzerine yazılmasını engellemek
- Sembolik linkleri yönetmek
Temel Kullanım
En basit haliyle cp şöyle kullanılır:
cp kaynak_dosya hedef_dosya
Örneğin:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
Bu komut nginx.conf dosyasını aynı dizinde .backup uzantısıyla kopyalar. Sunucuda bir değişiklik yapmadan önce bu tür yedekler almak en temel ve en sağlıklı alışkanlıklardan biridir.
Birden fazla dosyayı bir dizine kopyalamak için:
cp dosya1.txt dosya2.txt dosya3.txt /hedef/dizin/
Sık Kullanılan Parametreler
-r veya -R: Recursive (Dizin Kopyalama)
Dizinleri kopyalarken en çok ihtiyaç duyacağınız parametre -r‘dir. Bu parametre olmadan cp dizinleri kopyalamaz, hata verir.
cp -r /var/www/html /var/www/html_backup
Bu komut html dizinini içindeki tüm alt dizin ve dosyalarla birlikte html_backup adıyla kopyalar.
Dikkat: Hedef dizin zaten varsa, kaynak dizin hedef dizinin içine kopyalanır. Yani sonuçta /var/www/html_backup/html gibi bir yapı oluşabilir. Bunu önlemek için hedef dizin yokken çalıştırın ya da trailing slash kullanmaktan kaçının.
-p: İzinleri ve Zaman Damgalarını Koru
Varsayılan olarak cp, kopyaladığı dosyanın zaman damgasını günceller ve dosyayı mevcut kullanıcının sahipliğinde oluşturur. Eğer orijinal dosyanın tüm özelliklerini korumak istiyorsanız -p kullanın:
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
Bu özellikle yedek alırken kritik önem taşır. Sahiplik ve izinler korunmazsa bazı servislerin konfigürasyon dosyalarını okuyamadığını görebilirsiniz.
-a: Archive Modu (En Kapsamlı Kopyalama)
-a parametresi aslında -dR --preserve=all kombinasyonunun kısaltmasıdır. Sembolik linkleri korur, recursive çalışır, tüm metadata’yı saklar. Sistem yedekleme ve kullanıcı dizini taşıma işlemlerinde neredeyse her zaman -a kullanırım.
cp -a /home/ahmet /home/ahmet_backup
-i: İnteraktif Mod (Üzerine Yazmadan Önce Sor)
-i parametresi, hedefte aynı isimde bir dosya varsa üzerine yazmadan önce onay ister. Kritik sunucularda dosya kopyalarken bu parametreyi kullanmak sizi büyük baş ağrılarından kurtarır.
cp -i onemli_dosya.conf /etc/uygulama/
Çıktı:
cp: overwrite '/etc/uygulama/onemli_dosya.conf'?
y yazıp onaylarsınız ya da n ile vazgeçersiniz.
-n: Asla Üzerine Yazma
-i size seçenek sunarken -n tamamen sessiz çalışır ve var olan hiçbir dosyanın üzerine yazmaz. Toplu kopyalama işlemlerinde oldukça kullanışlıdır.
cp -n *.log /var/log/arsiv/
-u: Sadece Güncel Olanları Kopyala
-u parametresi, kaynak dosya hedef dosyadan daha yeni ise ya da hedefte yoksa kopyalar. Senkronizasyon benzeri senaryolarda işe yarar.
cp -u /kaynak/dizin/* /hedef/dizin/
-v: Verbose (Ne Yapıldığını Göster)
Kopyalama işlemi sırasında ne olduğunu ekranda görmek istiyorsanız -v ekleyin. Özellikle çok sayıda dosya kopyalarken ya da script yazarken hata ayıklamak için kullanışlıdır.
cp -rv /var/www/site1 /var/www/site1_backup
Gerçek Dünya Senaryoları
Senaryo 1: Web Sunucusu Konfigürasyonu Yedekleme
Bir Nginx veya Apache konfigürasyonuna dokunmadan önce yedeğini almak şart. Bunu tarih damgasıyla yaparsanız daha da iyi:
cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date +%Y%m%d_%H%M%S)
Bu komut nginx.conf.20241215_143022 gibi bir dosya oluşturur. Hangi tarihte ne değiştiğini kolayca takip edebilirsiniz.
Tüm nginx konfigürasyonunu yedeklemek için:
cp -a /etc/nginx /etc/nginx_backup_$(date +%Y%m%d)
Senaryo 2: Kullanıcı Ev Dizinini Taşıma
Yeni bir kullanıcı için mevcut bir şablon dizinini kopyalamak ya da kullanıcı ev dizinini başka bir diske taşımak sık karşılaşılan bir durumdur:
cp -a /home/template_user /home/yeni_kullanici
chown -R yeni_kullanici:yeni_kullanici /home/yeni_kullanici
-a ile tüm izinler ve yapı korunur, chown ile sahipliği yeni kullanıcıya devrediyoruz.
Senaryo 3: Log Dosyalarını Arşivleme
Disk dolmadan önce eski logları başka bir dizine ya da mount noktasına almak:
cp -v /var/log/app/*.log /mnt/arsiv/logs/
Ya da sadece belirli bir tarihten eski logları almak için find ile kombinleyebilirsiniz:
find /var/log/app/ -name "*.log" -mtime +30 -exec cp {} /mnt/arsiv/logs/ ;
Senaryo 4: Sembolik Linkleri Yönetmek
cp sembolik linklerle çalışırken dikkatli olmak gerekir. Varsayılan davranış sembolik linkin gösterdiği dosyayı kopyalamaktır, linkin kendisini değil.
Sembolik linki olduğu gibi kopyalamak için:
cp -a /etc/alternatives/java /usr/local/bin/java
Sadece linkin hedefini kopyalamak için (varsayılan):
cp /etc/alternatives/java /usr/local/bin/java_binary
Senaryo 5: Büyük Dosya Kopyalarken İlerlemeyi Takip Etmek
cp varsayılan olarak ilerleme göstermez. Büyük dosyalar kopyalarken ekran donmuş gibi görünebilir. Bunun için pv aracını kullanabilirsiniz:
pv /var/backup/buyuk_yedek.tar.gz | cp /dev/stdin /mnt/uzak_disk/buyuk_yedek.tar.gz
Ya da modern sistemlerde cp --progress benzeri bir şey istiyorsanız rsync -ah --progress tercih edebilirsiniz, ancak bu farklı bir araç tartışması.
Gelişmiş Kullanım Örnekleri
Belirli Uzantıdaki Dosyaları Kopyalamak
Glob pattern ile belirli uzantıdaki dosyaları tek seferde kopyalayabilirsiniz:
cp /var/log/*.log /var/log/arsiv/
Dikkat: Alt dizinlerdeki dosyalar bu komutla kopyalanmaz. Alt dizinler dahil kopyalamak için find kullanın.
Dizin Yapısını Koruyarak Kopyalamak
Bazen sadece belirli dosyaları kopyalamak ama orijinal dizin yapısını korumak istersiniz. Bunun için --parents parametresi kullanılır:
cp --parents /etc/nginx/conf.d/site.conf /backup/
Bu komut /backup/etc/nginx/conf.d/site.conf şeklinde tam yolu oluşturarak kopyalar.
Birden Fazla Kaynağı Tek Hedefe Kopyalamak
cp -r /var/www/site1 /var/www/site2 /var/www/site3 /mnt/yedek/web/
Bu komut üç dizini de /mnt/yedek/web/ içine kopyalar.
Hard Link Oluşturarak Kopyalamak
Disk alanından tasarruf etmek istiyorsanız ve orijinal dosyanın değişmeyeceğinden eminseniz hard link kullanabilirsiniz:
cp -l dosya.txt dosya_link.txt
Bu gerçek bir kopya oluşturmaz, aynı inode’u paylaşan iki dosya adı oluşturur. Birini değiştirirseniz diğeri de değişir.
Sık Yapılan Hatalar ve Çözümleri
Hata 1: Dizini -r Olmadan Kopyalamaya Çalışmak
cp /var/www/html /backup/
# cp: -r not specified; omitting directory '/var/www/html'
Çözüm: Her zaman dizin kopyalarken -r ya da -a kullanın.
Hata 2: Trailing Slash Karışıklığı
Bu ince ama önemli bir fark:
# Dizinin kendisini kopyalar (html_backup/html oluşur eğer html_backup varsa)
cp -r /var/www/html /var/www/html_backup
# Dizinin içeriğini kopyalar
cp -r /var/www/html/ /var/www/html_backup/
İkinci kullanımda trailing slash ekleyerek içeriği doğrudan hedefe aktarırsınız.
Hata 3: İzinleri Korumayı Unutmak
Root olarak bir dosyayı kopyaladığınızda ve -p ya da -a kullanmadığınızda, dosya root’un sahipliğinde oluşur. Uygulamanız o dosyayı okuyamaz hale gelebilir.
# Yanlış
cp /backup/app.conf /etc/uygulama/app.conf
# Doğru
cp -p /backup/app.conf /etc/uygulama/app.conf
Hata 4: Var Olan Dosyaların Üzerine Farkında Olmadan Yazmak
Özellikle wildcard kullanırken var olan dosyaların üzerine yazabilirsiniz. Alışkanlık olarak kritik kopyalamalarda -i kullanın:
cp -i *.conf /etc/uygulama/
cp ile İlgili Faydalı İpuçları
Alias Tanımlamak
Yanlışlıkla üzerine yazmaları önlemek için .bashrc ya da .bash_profile dosyanıza şu alias’ı ekleyebilirsiniz:
alias cp='cp -i'
Bu sayede her cp komutunda var olan dosyalar için onay istenir. Ancak script yazarken bu alias sorun çıkarabileceği için scriptlerde cp ile orijinal komutu çağırın.
Noktalı Dosyaları Kopyalamak
Bir dizindeki tüm dosyaları (noktalı gizli dosyalar dahil) kopyalamak için:
cp -a /home/ahmet/. /home/ahmet_backup/
Sondaki /. gizli dosyaları da kapsama alır. Bu çok önemli bir detay; örneğin .bashrc, .ssh, .profile gibi dosyalar bu şekilde kopyalanır.
Kopyalamadan Önce Fark Kontrolü
Kopyalamadan önce ne değişeceğini görmek isterseniz diff kullanın:
diff /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
cp mi, rsync mi?
Sysadmin dünyasında sık sorulan bir soru: “Bunun için cp mi kullansam rsync mi?”
cp kullanın:
- Basit, tek seferlik kopyalama işlemleri için
- Lokal dosya sistemi içi işlemler için
- Hız önceliğinizse (rsync biraz daha yavaştır)
- Script içinde basit kopyalama yapıyorsanız
rsync tercih edin:
- Uzak sunucuya kopyalama yapıyorsanız
- Senkronizasyon (sadece değişenleri kopyala) gerekiyorsa
- İlerleme çubuğu istiyorsanız
- Bant genişliği yönetimi yapmanız gerekiyorsa
- Büyük dizin ağaçlarını periyodik olarak yedekliyorsanız
Güvenlik Notları
cp kullanırken güvenlik açısından dikkat edilmesi gereken birkaç nokta var:
- SetUID/SetGID dosyaları: Kopyalama sırasında setuid/setgid bitleri genellikle korunmaz (root olmayan kullanıcılarda). Bu güvenlik açısından aslında iyi bir davranıştır.
- ACL’ler: Extended ACL’leri korumak için
--preserve=allya da-akullanın ve dosya sisteminizin ACL desteklediğinden emin olun. - Symlink saldırıları: Güvenilmeyen kaynaklardan
-aile kopyalama yaparken sembolik link tuzaklarına dikkat edin. Özellikle root olarak çalışıyorsanız symlink’in nereye işaret ettiğini kontrol edin.
Hızlı Referans Tablosu
Sık kullandığım parametre kombinasyonlarını şöyle özetleyebilirim:
-rveya-R: Recursive dizin kopyalama-p: İzin, sahiplik ve zaman damgasını koru-a: Archive modu (en kapsamlı, genellikle en iyi seçenek)-i: Üzerine yazmadan önce sor-n: Asla üzerine yazma-u: Sadece güncel olanları kopyala-v: Verbose, ne kopyalandığını göster-l: Kopya yerine hard link oluştur--parents: Kaynak dizin yapısını koru
Sonuç
cp komutu göründüğünden çok daha güçlü ve bir o kadar da tuzak dolu bir araçtır. Günlük sysadmin işlerinde doğru parametreleri kullanmak; yanlışlıkla üzerine yazılan dosyaları, bozulan izinleri ve eksik kopyaları önler. En temel alışkanlıklar olarak şunları öneririm: konfigürasyon dosyalarına dokunmadan önce -p ile yedek alın, dizin kopyalarken -a kullanın, kritik ortamlarda -i ile çalışın.
Eğer sadece bir şey aklınızda kalsın istiyorum: cp -a büyük çoğunlukla en güvenli ve en kapsamlı seçeneğinizdir. Sembolik linkleri korur, izinleri taşır, recursive çalışır. Emin olmadığınızda -a ile başlayın.
cp komutunu gerçekten içselleştirdiğinizde, karmaşık yedekleme scriptleri yazmak ve sistem göçleri yapmak çok daha kolay ve güvenli hale gelecektir.