cp Komutu: Linux’ta Dosya ve Dizin Kopyalama Komple Rehber

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=all ya da -a kullanın ve dosya sisteminizin ACL desteklediğinden emin olun.
  • Symlink saldırıları: Güvenilmeyen kaynaklardan -a ile 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:

  • -r veya -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.

Yorum yapın