CMD ile Xcopy Komutu Kullanarak Dizin Ağacı Kopyalama

Yıllarca Windows ortamında çalışan sistem yöneticileri bilir: Bir gün mutlaka büyük bir dosya veya dizin taşıma işiyle karşılaşırsınız. Robocopy her zaman aklınıza gelen ilk araç olabilir, ama xcopy komutu da doğru parametrelerle kullanıldığında son derece güçlü ve esnek bir çözüm sunar. Özellikle eski Windows Server ortamlarında veya script uyumluluğu gerektiren durumlarda xcopy hâlâ birinci tercih olmaya devam eder.

Xcopy Nedir ve Neden Kullanılır?

xcopy, Windows işletim sistemine yıllardır dahil olan gelişmiş bir dosya kopyalama aracıdır. Klasik copy komutunun aksine, dizin ağaçlarını, gizli dosyaları, sistem dosyalarını ve alt dizinleri kopyalayabilir. Windows NT döneminden beri var olan bu araç, hâlâ geçerliğini koruyan onlarca parametreyle birlikte gelir.

Peki neden xcopy tercih edilir? Birkaç temel neden şunlar:

  • Dizin ağacı desteği: Alt dizinleriyle birlikte tüm yapıyı kopyalar.
  • Seçici kopyalama: Tarih, özellik veya maske bazlı filtreleme yapabilirsiniz.
  • Script uyumluluğu: Eski .bat dosyalarında ve legacy sistemlerde sorunsuz çalışır.
  • Hata yönetimi: Kopyalama hataları için çıkış kodları döner, bu da otomasyon için kritiktir.
  • Hafif ve hızlı: GUI gerektirmez, doğrudan komut satırından çalışır.

Temel Xcopy Kullanımı

En basit haliyle xcopy şu şekilde çalışır:

xcopy C:Kaynak D:Hedef

Bu komut sadece kaynak dizindeki dosyaları kopyalar, alt dizinleri dahil etmez. Gerçek senaryolarda bu genellikle yeterli olmaz. Dizin ağacını kopyalamak için /S veya /E parametresini kullanmanız gerekir.

xcopy C:Kaynak D:Hedef /S /E /I

Burada kullanılan parametrelerin anlamları:

  • /S: Alt dizinleri de kopyalar (boş dizinler hariç)
  • /E: Boş dizinler dahil tüm alt dizinleri kopyalar
  • /I: Hedef bir dizin ise soru sormadan devam eder, hedef dizin yoksa oluşturur

Temel Parametreler

Xcopy’nin parametrelerini anlamak, doğru senaryoda doğru komutu yazmanın temelidir. İşte en sık kullanılan parametreler:

  • /S: Alt dizinleri kopyalar, boş olanları atlar
  • /E: Boş dizinler dahil tüm alt dizinleri kopyalar
  • /I: Hedef bir dizin olarak kabul edilir, eğer yoksa oluşturulur
  • /H: Gizli ve sistem dosyalarını da kopyalar
  • /R: Salt okunur dosyaların üzerine yazar
  • /Y: Üzerine yazma onayını otomatik olarak kabul eder
  • /C: Hatalar olsa bile kopyalamaya devam eder
  • /D: Yalnızca belirtilen tarihten sonra değiştirilmiş dosyaları kopyalar
  • /A: Yalnızca arşiv özelliği açık dosyaları kopyalar
  • /M: Arşiv özelliği açık dosyaları kopyalar ve özelliği sıfırlar (yedekleme için ideal)
  • /V: Kopyalanan dosyaları doğrular
  • /F: Kopyalama sırasında kaynak ve hedef dosya adlarını gösterir
  • /L: Gerçekten kopyalamadan neyin kopyalanacağını listeler (dry run)
  • /X: Dosya denetim bilgilerini (ACL) kopyalar
  • /O: Dosya sahipliği ve ACL bilgilerini kopyalar
  • /G: Şifreli dosyaların şifresiz hedefe kopyalanmasına izin verir
  • /Q: Kopyalama sırasında dosya adlarını göstermez (sessiz mod)
  • /P: Her dosya için onay ister
  • /W: Kopyalamaya başlamadan önce tuşa basılmasını bekler
  • /T: Dizin yapısını oluşturur ama dosyaları kopyalamaz
  • /K: Sadece okunabilir özelliğini korur, aksi halde sıfırlanır
  • /N: Kısa dosya adlarıyla kopyalar (8.3 formatı)
  • /U: Sadece hedefte zaten var olan dosyaları günceller
  • /B: Dosya yerine sembolik bağlantıyı kopyalar

Gerçek Dünya Senaryoları

Senaryo 1: Sunucu Migrasyonu Sırasında Uygulama Dizini Taşıma

Bir Windows Server 2016’dan 2022’ye geçiş yapıyorsunuz. Uygulamanın C:AppDataMyApp dizinini yeni sunucuya taşımanız gerekiyor. Gizli dosyalar, sistem dosyaları ve ACL bilgileri korunmalı.

xcopy C:AppDataMyApp \NewServerD$AppDataMyApp /E /H /R /Y /O /I /C

Bu komutla:

  • /E ile boş dizinler dahil tüm yapı kopyalanır
  • /H ile gizli ve sistem dosyaları dahil edilir
  • /R ile salt okunur dosyaların üzerine yazılır
  • /Y ile onay sorulmaz
  • /O ile sahiplik ve ACL bilgileri taşınır
  • /C ile hata alınsın bile devam edilir

Eğer önce neyin kopyalanacağını görmek istiyorsanız, /L parametresiyle bir dry run yapın:

xcopy C:AppDataMyApp \NewServerD$AppDataMyApp /E /H /R /Y /O /I /C /L

Senaryo 2: Günlük Yedekleme Script’i

Üretim ortamında kritik verileri her gece yedeklemek için xcopy kullanan basit ama etkili bir script:

@echo off
set KAYNAK=C:ProdData
set HEDEF=D:Backup%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%
set LOG=D:Logsbackup_%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%.log

echo Yedekleme basladi: %DATE% %TIME% >> %LOG%

xcopy %KAYNAK% %HEDEF% /E /H /R /Y /M /C /I >> %LOG% 2>&1

if %ERRORLEVEL% == 0 (
    echo Yedekleme BASARILI tamamlandi >> %LOG%
) else (
    echo HATA: Yedekleme basarisiz. Hata kodu: %ERRORLEVEL% >> %LOG%
)

echo Yedekleme bitti: %DATE% %TIME% >> %LOG%

Burada /M parametresinin kullanıldığına dikkat edin. Bu parametre arşiv bitini kopyaladıktan sonra sıfırlar, yani bir sonraki yedeklemede sadece değişen dosyalar kopyalanır. Bu incremental yedekleme için klasik bir yaklaşımdır.

Senaryo 3: Belirli Dosya Türlerini Kopyalama

Sadece belirli uzantıdaki dosyaları kopyalamak istediğinizde xcopy’yi wildcard ile kullanabilirsiniz:

xcopy C:Raporlar*.xlsx D:ArsivRaporlar /S /Y /I

Ya da birden fazla uzantı için döngü kullanabilirsiniz:

@echo off
for %%X in (xlsx docx pdf) do (
    xcopy C:Belgeler*.%%X D:Arsiv%%X /S /Y /I /C
)
echo Tum dosyalar kopyalandi.

Senaryo 4: Değiştirilmiş Dosyaları Senkronize Etme

Belirli bir tarihten sonra değiştirilmiş dosyaları kopyalamak için /D parametresi kullanılır:

xcopy C:WebRoot D:StagingWebRoot /S /E /D:01/01/2024 /Y /I

Bu komut sadece 01/01/2024 tarihinden sonra değiştirilen dosyaları kopyalar. Web sunucusu güncellemelerinde veya staging ortamına seçici taşıma işlemlerinde oldukça kullanışlıdır.

Senaryo 5: Dizin Yapısını Dosyasız Oluşturma

Bazen hedef sunucuda dizin iskeletini oluşturmak ama dosya kopyalamamak isteyebilirsiniz. Deploy öncesi hazırlık senaryolarında çok kullanışlıdır:

xcopy C:AppStructure D:NewDeploy /T /E /I

/T parametresi sadece dizin yapısını oluşturur. /E ile birlikte kullanıldığında boş dizinler de dahil edilir. Dosyalar kopyalanmaz.

Senaryo 6: Network Paylaşımına Kopyalama

Uzak bir sunucudaki paylaşıma kopyalama yaparken şu yapıyı kullanabilirsiniz:

net use Z: \FileServerSharedFolder /user:DOMAINserviceaccount Password123
xcopy C:LocalData Z:RemoteBackup /E /H /R /Y /C /V
net use Z: /delete

Burada önce network sürücüsünü bağladık, kopyaladık ve sonra bağlantıyı kestik. /V parametresi kopyalama sonrası doğrulama yapar, kritik veriler için önerilir.

Senaryo 7: Log Dosyalarına Yazmak ile Kapsamlı Yedekleme

Production ortamında her şeyin izlenebilir olması gerekir. İşte daha kapsamlı bir script:

@echo off
setlocal EnableDelayedExpansion

set TARIH=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
set SAAT=%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
set SAAT=%SAAT: =0%
set LOG_DOSYASI=C:Logsxcopy_%TARIH%_%SAAT%.log
set KAYNAK=C:Kritik
set HEDEF=\BackupServerBackups%TARIH%

echo ========================================== >> %LOG_DOSYASI%
echo Baslangi Zamani: %DATE% %TIME% >> %LOG_DOSYASI%
echo Kaynak: %KAYNAK% >> %LOG_DOSYASI%
echo Hedef: %HEDEF% >> %LOG_DOSYASI%
echo ========================================== >> %LOG_DOSYASI%

xcopy %KAYNAK% %HEDEF% /E /H /R /Y /C /V /F >> %LOG_DOSYASI% 2>&1

set HATA_KODU=%ERRORLEVEL%

echo ========================================== >> %LOG_DOSYASI%
echo Bitis Zamani: %DATE% %TIME% >> %LOG_DOSYASI%
echo Cikis Kodu: %HATA_KODU% >> %LOG_DOSYASI%

if %HATA_KODU% EQU 0 echo DURUM: BASARILI >> %LOG_DOSYASI%
if %HATA_KODU% EQU 1 echo DURUM: Hicbir dosya kopyalanamadi >> %LOG_DOSYASI%
if %HATA_KODU% EQU 2 echo DURUM: Kullanici CTRL+C ile iptal etti >> %LOG_DOSYASI%
if %HATA_KODU% EQU 4 echo DURUM: Baslatma hatasi >> %LOG_DOSYASI%
if %HATA_KODU% EQU 5 echo DURUM: Disk yazma hatasi >> %LOG_DOSYASI%

endlocal

Xcopy Çıkış Kodları

Otomasyon scriptlerinde hata yönetimi için xcopy’nin döndürdüğü çıkış kodlarını bilmek şarttır:

  • 0: Hata olmadan kopyalama tamamlandı
  • 1: Kopyalanacak dosya bulunamadı
  • 2: Kullanıcı CTRL+C ile işlemi iptal etti
  • 4: Başlatma hatası, geçersiz parametre veya yetersiz bellek
  • 5: Disk yazma hatası oluştu

Bu kodları script’inizde %ERRORLEVEL% ile kontrol edebilirsiniz.

Dikkat Edilmesi Gereken Durumlar

Hedef Belirsizliği

Xcopy’nin en bilinen tuzağı hedefin dosya mı yoksa dizin mi olduğu sorusudur. Şu komutu çalıştırdığınızda:

xcopy C:Kaynakdosya.txt D:Hedefyeni

Xcopy size şunu sorar: D:Hedefyeni bir dosya mı (F) yoksa dizin mi (D)? Script içinde bunu otomatikleştirmek için ya /I kullanın ya da hedefin sonuna ekleyin:

xcopy C:Kaynakdosya.txt D:Hedefyeni /Y

Uzun Yol Adları

Windows 10 ve Server 2019 öncesinde 260 karakter yol sınırı xcopy’yi etkileyebilir. Uzun yol adlarınız varsa bunu göz önünde bulundurun. Registry’den uzun yol desteğini aktifleştirmek bu sorunu çözer ama xcopy’nin kendisi hâlâ sınırlı kalabilir. Bu durumda Robocopy daha iyi bir seçenek olabilir.

Sembolik Bağlantılar

Varsayılan olarak xcopy sembolik bağlantıların hedefini kopyalar, bağlantının kendisini değil. Bağlantıyı korumak istiyorsanız /B parametresi gerekir ama bu davranış senaryoya göre farklı sonuçlar doğurabilir.

ACL ve İzin Kopyalama

Dosya izinlerini kopyalamak için /O ve /X parametrelerini kullanabilirsiniz, ancak bu işlemin çalışması için hedef sistemde gerekli izinlere sahip olmanız gerekir. Servis hesabı kullanıyorsanız hedef üzerinde yeterli ayrıcalıkları kontrol edin.

Xcopy mi, Robocopy mi?

Bu soru sık gündeme gelir. Kısa cevap: Her iki araç da yerini bilmek kaydıyla değerlidir.

Xcopy’nin avantajlı olduğu durumlar:

  • Eski sistemlerle uyumluluk gerektiğinde
  • Legacy script’lerde zaten xcopy kullanılıyorsa
  • Basit ve hızlı tek seferlik kopyalamalarda
  • Windows XP veya Server 2003 gibi eski ortamlarda

Robocopy’nin öne çıktığı durumlar:

  • Mirror (birebir eşitleme) işlemlerinde
  • Büyük dosya kütüphanelerinde
  • Çok iş parçacıklı kopyalamada (/MT parametresi)
  • Kopyalama hataları için otomatik yeniden denemede
  • Daha ayrıntılı log formatında

Pratik öneri: Yeni projelerde ve modern sistemlerde Robocopy’yi tercih edin. Eski ortamlarda veya xcopy’ye özgü davranış gerektiren durumlarda xcopy kullanmaya devam edin.

Büyük Dizin Ağaçları için Performans İpuçları

Xcopy ile büyük veri kopyalarken şu noktalara dikkat edin:

  • Antivirüs yazılımı: Kopyalama sırasında antivirüs taramasını geçici olarak devre dışı bırakmayı düşünebilirsiniz, özellikle büyük dosya sayılarında ciddi yavaşlama yaratır.
  • Ağ bant genişliği: Uzak sunucuya kopyalama yapıyorsanız yoğun olmayan saatleri tercih edin.
  • /Q parametresi: Ekrana çıktı yazmak da zaman alır. Sessiz modda çalıştırarak log dosyasına yönlendirme yapabilirsiniz.
  • NAS veya SAN: Doğrudan storage seviyesinde snapshot veya klon işlemi mümkünse önce bunu değerlendirin.

Görev Zamanlayıcı ile Xcopy Otomasyonu

Yazdığınız script’i Task Scheduler ile zamanlamak için:

schtasks /create /tn "GeclikYedekleme" /tr "C:Scriptsyedekle.bat" /sc daily /st 02:00 /ru SYSTEM /rl HIGHEST

Bu komut her gece saat 02:00’de belirtilen bat dosyasını SYSTEM hesabıyla en yüksek ayrıcalıkla çalıştırır. /ru SYSTEM kullanıldığında şifre gerekmez ama ağ kaynaklarına erişim için servis hesabı tercih edilmelidir.

Görev durumunu kontrol etmek için:

schtasks /query /tn "GeclikYedekleme" /fo LIST /v

Sonuç

xcopy komutu, görünüşte basit bir kopyalama aracı olarak düşünülse de doğru parametrelerle son derece esnek ve güçlü senaryolar için kullanılabilir. Özellikle kurumsal Windows ortamlarında hâlâ aktif rol oynayan bu komut, sistem yöneticisinin araç kutusunda kesinlikle yer almalı.

Önemli birkaç noktayı tekrar vurgulayalım: Script’lerinizde mutlaka çıkış kodlarını kontrol edin, kritik kopyalama işlemlerinde /V ile doğrulama yapın, büyük transferler öncesinde /L ile dry run çalıştırın. Production ortamında herhangi bir kopyalama operasyonuna kör bir şekilde girişmek, geri döndürülemez sonuçlar doğurabilir.

Modern Windows Server ortamları için Robocopy çoğu zaman daha iyi bir tercih olsa da xcopy’nin esnekliği, basitliği ve legacy uyumluluğu onu vazgeçilmez kılar. Bir sonraki sunucu migrasyonunuzda veya yedekleme çözümünüzde bu araçları birlikte değerlendirin, hangisinin senaryonuza daha uygun olduğuna bilinçli bir şekilde karar verin.

Yorum yapın