Üzerine yazmadan dosyaları kopyala


99

Komut satırında "tüm dosyaları A dizininden B dizinine kopyala" demenin bir yolunu bulamıyorum, ancak dosya zaten B dizininde mevcutsa, hangi dosya daha yeni olursa olsun, üzerine yazma ve bana sorma. "

Kopyalama, taşıma, xcopy ve robocopy'den geçtim ve alabildiğim en yakın şey robocopy'ye "A'dan B'ye kopyala, ancak eski dosyalarla daha yeni dosyaların üzerine yazmayın" diyebilmenizdir, ancak bu benim için çalışmıyor . Xxcopy'ye baktım, ancak bir Visual Studio post-build olayına üçüncü taraf bağımlılığı istemediğim için, diğer SVN kullanıcılarının derlemeyi yapmak için bu aracı yüklemesini gerektirecek bir durum istemiyorum.

Yeni EF modeli nesneleri için T4 şablonlarından oluşturulan dosyaların ait oldukları proje klasörlerine dağıtılması, ancak mevcut nesneler için yeniden oluşturulan dosyalara dağıtılması için Visual Studio 2010'da derleme sonrası olayına bir komut satırı eklemek istiyorum potansiyel olarak düzenlenmiş hedef dosyaların üzerine yazmayın.

T4 şablonu yeniden oluşturulduğundan, kaynak dosya her zaman daha yenidir ve "yeni" anahtarı güvenilir bir şekilde kullanamıyorum, sanmıyorum.

Yapabildiğim öğeler için kısmi sınıflar kullanıyorum, ancak kısmi sınıfları kullanamayan başka şeyler de var (ör. Varsayılan bir EditorTemplate veya DisplayTemplate * .ascx dosyası oluşturma).

Çözdüğü benzer sorunları olan var mı?


Eğer aşina mısınız cmd.exebireyin forkomuta? Değilse, koşmanızı for /?ve kullanmanızı tavsiye ederim .
Gabe

Yanıtlar:


38
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"

5
Bu benim için çalıştı, ancak bunu komut satırı yerine bir toplu iş dosyasının içinden çalıştırdığım için bir yerine yüzde iki sembol kullanmak zorunda kaldım. % F örneklerini %% F ve% ~ nxF örneklerini %% ~ nxF ile değiştirdim.
Owen

1
Ne gelmez ~nxde %~nxFtam olarak yani?
Serge Rogatch

@stu, sadece ~nxFdeğişkenin Fbir dosya adına ve bir uzantıya dönüştüğünü söyler .
Serge Rogatch

Evet, çok etkili bir şekilde bana dosya adı + uzantısını yol olmadan verin - hedef klasörde testi yapmanız ve hedef dosya adını belirtmeniz gereken şey budur. Önemli olan nokta,% F'nin yolu içermesidir ve siz onu orada istemezsiniz.
Stu

207

Robocopy , ya da "sağlam bir dosya kopyalama", bir komut satırı dizin çoğaltma komuttur. Windows NT 4.0'dan başlayarak Windows Kaynak Seti'nin bir parçası olarak kullanıma sunulmuştur ve Windows Vista, Windows 7 ve Windows Server 2008'in standart bir özelliği olarak tanıtılmıştır.

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

Detaylandırmak için (Hydrargyrum, HailGallaxar ve Andy Schmidt cevaplarını kullanarak):

  • /E Robocopy, boş olanlar dahil alt dizinleri yinelemeli olarak kopyalamasını sağlar.
  • /XCaynı zaman damgasına sahip ancak farklı dosya boyutlarına sahip mevcut dosyaları hariç tutar. Robocopy normalde bunların üzerine yazar.
  • /XNhedef dizindeki kopyadan daha yeni var olan dosyaları hariç tutar. Robocopy normalde bunların üzerine yazar.
  • /XOhedef dizindeki kopyadan daha eski var olan dosyaları hariç tutar. Robocopy normalde bunların üzerine yazar.

Değiştirilmiş, Daha Eski ve Yeni sınıflar hariç tutulduğunda, Robocopy, bir komut dosyası ortamı yüklemeye gerek kalmadan, orijinal posterin tam olarak istediğini yapar.

Referanslar: Technet , Wikipedia
İndirme kaynağı: Microsoft İndirme Bağlantısı (Bağlantı en son 30 Mart 2016 tarihinde doğrulanmıştır)


"Hariç tut" ile "atla" mı yoksa "sil / kaldır" mı?
hava saldırısı

@Andre Terra: Normalde atla. / MIR bayrağını kullanıyorsanız, onları kaldırabilir. Bunu test etmedim.
Hydrargyrum

/ MIR ile, kaynakta bulunmayan dosyalar gerçekten kaldırılır. Ancak / XN ve / XO kullanılırken, her iki yerde de bulunan dosyalar basitçe atlanır (boyutun kontrol edilip edilmediğinden emin değilsiniz). Bu, uygulamamın daha yeni veya daha eski bir sürümünü kopyalamam gereken, ancak uygulamanın kullandığı kitaplıkların tarih değiştirilmiş damgalarının yanlış olduğu, ancak dosya adlarının sürüm numaralarını içerdiği durumum için idealdir.
Henno Vermeulen

Dahil etmek gerekli /emi? Ya /sonun yerine kullanırsan? Bir sürü boş alt klasör istemiyorum.
Arete

48

Belisarius'un çözümü iyidir.

Bu biraz kısa cevabı detaylandırmak için:

  • /E Robocopy, boş olanlar dahil alt dizinleri yinelemeli olarak kopyalamasını sağlar.
  • /XCaynı zaman damgasına sahip ancak farklı dosya boyutlarına sahip mevcut dosyaları hariç tutar. Robocopy normalde bunların üzerine yazar.
  • /XNkaynak dizindeki kopyadan daha yeni var olan dosyaları hariç tutar. Robocopy normalde bunların üzerine yazar.
  • /XOkaynak dizindeki kopyadan daha eski mevcut dosyaları hariç tutar. Robocopy normalde bunların üzerine yazar.

Değiştirilmiş, Daha Eski ve Yeni sınıflar hariç tutulduğunda, Robocopy, bir komut dosyası ortamı yüklemeye gerek kalmadan, orijinal posterin tam olarak istediğini yapar.


46

Bunu deneyebilirsiniz:

echo n | copy /-y <SOURCE> <DESTINATION>

-yüzerine yazmadan önce basitçe yönlendirir ve tüm bu sorulara yöneltebiliriz. Yani bu aslında var olmayan dosyaları kopyalar. :)


2
Çok basit.
Holf

6
Neden sadece bir kez pipo çaldığımızda tüm soruları yanıtlıyor?
phuclv

Harika, bu seçeneği tercih ettim. Boruyu düşünmeden önce, eksik olduğumu düşündüğüm bir parametre için googledim ve sonra bu sayfaya rastladım. Bu çözümü denerken, kopyalamanın görünüşte / Y parametresini etkinleştirdiğini fark ettim, bu yüzden / -Y eklenmelidir.
Andrew

2
@phuclv Görünüşe göre copy /-ystdin girdisi bittiğinde hiçbir zaman otomatik olarak varsayılır. İlk müstehcen nveya boruyu atlayabilirsiniz < nulve aynı şey olur.
mwfearnley

6

İşte toplu iş dosyası biçiminde:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"

3

Sadece kendi testlerimden bir şeyi açıklığa kavuşturmak istiyorum.

@Hydrargyrum şunu yazdı:

  • / XN, kaynak dizindeki kopyadan daha yeni var olan dosyaları dışlar. Robocopy normalde bunların üzerine yazar.
  • / XO, kaynak dizindeki kopyadan daha eski var olan dosyaları dışlar. Robocopy normalde bunların üzerine yazar.

Bu aslında geriye doğru. XN, "Daha Yeni" dosyaları dışlar, ancak hedef dizindeki kopyadan daha yeni olan dosyaları hariç tutar . XO, "Daha Eski'yi dışta tut" yapar, ancak hedef dizindeki kopyadan daha eski dosyaları hariç tutar .

Elbette her zamanki gibi kendi testlerinizi yapın.


1
Bu orijinal soruya bir cevap mı yoksa başka birinin cevabına bir yorum mu?
ASGM

1
Hydrargyrum'un cevabı orijinal soruya cevap yazarken +25 oyu mu yoksa başka birinin cevabına bir yorum mu?
mo.

3

Bunu xcopy ile yapmanın garip bir yolu var:

echo nnnnnnnnnnn | xcopy /-y source target

Kopyaladığınız dosyalar kadar n'yi dahil edin ve üzerine yazma sorularının tümüne n yanıtını verecektir.


İle ilgili olarak copy, bkz bu cevabı , özellikle @mwfearnley comment: copy /-yotomatik varsayar nEğer örneğin böylece Stdin, bitkin bir kez echo nsadece bir kez ve hala çalışıyor.
rsenna

3
robocopy src dst /MIR /XX

/ XX: "eXtra" dosyalarını ve dizinlerini dışla (hedefte mevcut ancak kaynakta değil). Bu, hedeften herhangi bir silinmeyi önleyecektir. (bu varsayılandır)


1

Robocopy, halihazırda kurulu olmadığı sistemler için buradan indirilebilir. (Yani Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (kurulum için yeniden başlatma gerekmez)

Robocopy exe'ye giden yolu belirlemeyi unutmayın. Bunu, "bilgisayarım"> özellikler> gelişmiş> "Ortam Değişkenleri" ni sağ tıklayarak, ardından sistem değişkenini bulup bunu sona ekleyerek yaparsınız: "; C: \ Program Files \ Windows Resource Kits \ Tools" veya nerede olursanız olun onu kurdu. Zaten orada olan yol değişkeni dizelerini bıraktığınızdan ve sadece ek yolu eklediğinizden emin olun.

Yol ayarlandıktan sonra belisarius'un önerdiği komutu çalıştırabilirsiniz. Harika çalışıyor.


1

Yanlış mesajlar hakkında doğrudan yorum yapmama izin vermiyor - ancak herkesi / XN ve / XO seçeneklerinin tanımının önceki mesajlarda gönderilenlerle karşılaştırıldığında TERSİNE çevrildiği konusunda uyarmama izin verin.

Daha Eski / Daha Yeni dosyaları Hariç Tut seçeneği, RoboCopy'nin günlüğünde görüntülenen bilgilerle tutarlıdır: RoboCopy, KAYNAK boyunca yineleme yapacak ve ardından KAYNAK'taki her dosyanın hedefteki dosyadan "ESKİ" veya "YENİ" olup olmadığını bildirecektir.

Sonuç olarak, / XO burada iddia edildiği gibi "kaynaktan daha eski" olmayan OLDER SOURCE dosyalarını (sezgisel olan) hariç tutacaktır.

Yalnızca yeni veya değiştirilmiş kaynak dosyaları kopyalamak, ancak daha yeni hedef dosyaları değiştirmekten kaçınmak istiyorsanız, / XO kullanmak doğru seçenektir.


0

Basit bir yaklaşım, iki dizini yansıtmak için / MIR seçeneğini kullanmak olacaktır. Temel olarak yalnızca yeni dosyaları hedefe kopyalar. Sonraki komutta kaynağı ve hedefi klasörlerinizin yollarıyla değiştirin, komut dosyası herhangi bir uzantıya sahip herhangi bir dosyayı arayacaktır.

robocopy <source directory> <destination directory> *.* /MIR

0

Bu benim için çalıştı. Bunu, üzerine yazma olmadan diğer sürücüye dosya "eklemek" için kullanıyorum.

Toplu iş dosyası: robocopy-missingfiles.bat

@echo off
echo Copying 
echo      "%1"
echo   to "%2"
echo.
echo Press Cntr+C to abort
Pause
echo.
@echo on
robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information"

Misal:

robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\

Uygulamadan önce test yapın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.