Salin file tanpa menimpa

99

Sepertinya saya tidak dapat menemukan cara di baris perintah untuk mengatakan "salin semua file dari direktori A ke direktori B, tetapi jika file sudah ada di direktori B, jangan menimpanya, tidak peduli file mana yang lebih baru , dan jangan meminta saya. "

Saya telah melalui proses copy, move, xcopy & robocopy, dan hal terdekat yang bisa saya dapatkan adalah Anda dapat memberi tahu robocopy "copy A ke B, tapi jangan menimpa file baru dengan file yang lebih lama," tetapi itu tidak berhasil untuk saya . Saya melihat xxcopy, tetapi membuangnya, karena saya tidak ingin memiliki ketergantungan pihak ketiga pada acara pasca-pembuatan Visual Studio yang akan memerlukan pengguna SVN lain untuk menginstal alat itu untuk melakukan pembangunan.

Saya ingin menambahkan baris perintah ke acara pasca-pembangunan di Visual Studio 2010 sehingga file yang dihasilkan dari template T4 untuk objek model EF baru dapat didistribusikan ke folder proyek tempat mereka berada, tetapi file yang dibuat ulang untuk objek yang ada jangan menimpa file tujuan yang mungkin diedit.

Karena template T4 dibuat ulang, file sumber selalu lebih baru, dan saya tidak dapat menggunakan tombol "lebih baru" dengan andal, saya rasa.

Saya menggunakan kelas parsial untuk item yang saya bisa, tetapi ada hal lain yang saya hasilkan yang tidak dapat menggunakan kelas parsial (misalnya membuat file EditorTemplate atau DisplayTemplate * .ascx default).

Adakah yang memiliki masalah serupa yang telah mereka selesaikan?

Tony
sumber
Apakah Anda akrab dengan cmd.exe's forperintah? Jika tidak, saya sarankan Anda menjalankan for /?dan menggunakannya.
Gabe

Jawaban:

38
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
Stu
sumber
5
Ini berhasil untuk saya, tetapi saya harus menggunakan simbol dua persen alih-alih satu karena saya menjalankan ini dari dalam file batch daripada baris perintah. Saya mengganti instance% F dengan %% F dan instance% ~ nxF dengan %% ~ nxF.
Owen
1
Apa ~nxdi %~nxFsebenarnya artinya?
Serge Rogatch
@ stu, ini hanya mengatakan bahwa untuk ~nxFvariabel Fberubah menjadi nama file dan ekstensi.
Serge Rogatch
Ya, sangat efektif, beri saya nama file + ekstensi, tanpa jalur - yang perlu Anda lakukan pengujian di folder target dan tentukan nama file target. Intinya adalah% F menyertakan jalur, dan Anda tidak menginginkannya di sana.
Stu
207

Robocopy , atau "Robust File Copy", adalah perintah replikasi direktori baris perintah. Ini telah tersedia sebagai bagian dari Windows Resource Kit yang dimulai dengan Windows NT 4.0, dan diperkenalkan sebagai fitur standar Windows Vista, Windows 7 dan Windows Server 2008.

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

Untuk menguraikan (menggunakan jawaban Hydrargyrum, HailGallaxar dan Andy Schmidt):

  • /E membuat Robocopy menyalin subdirektori secara rekursif, termasuk yang kosong.
  • /XCmengecualikan file yang ada dengan stempel waktu yang sama, tetapi ukuran file berbeda. Robocopy biasanya menimpa itu.
  • /XNmengecualikan file yang sudah ada yang lebih baru dari salinan di direktori tujuan. Robocopy biasanya menimpa itu.
  • /XOmengecualikan file yang sudah ada yang lebih lama dari salinan di direktori tujuan. Robocopy biasanya menimpa itu.

Dengan pengecualian kelas Berubah, Lebih Lama, dan Lebih Baru, Robocopy melakukan apa yang diinginkan pembuat aslinya - tanpa perlu memuat lingkungan skrip.

Referensi: Technet , Wikipedia
Unduh dari: Tautan Unduhan Microsoft (Tautan terakhir diverifikasi pada 30 Maret 2016)

Dr. belisarius
sumber
Yang Anda maksud dengan 'kecualikan' adalah 'lewati' atau 'hapus / hapus'?
serangan udara
@ Andre Terra: Lewati, biasanya. Jika Anda menggunakan flag / MIR, itu mungkin menghapusnya. Saya belum mengujinya.
Hydrargyrum
Dengan / MIR, file yang tidak ada di sumber memang dihapus. Tetapi ketika juga menggunakan / XN dan / XO, file yang ada di kedua tempat akan dilewati begitu saja (tidak yakin apakah ukuran dicentang). Ini sangat ideal untuk situasi saya di mana saya perlu menyalin baik versi yang lebih baru atau lebih lama dari aplikasi saya tetapi di mana perangko dateModified dari perpustakaan yang digunakan aplikasi tidak benar namun nama file itu sendiri berisi nomor versinya.
Henno Vermeulen
Apakah perlu disertakan /e? Bagaimana jika Anda menggunakan /ssebagai gantinya? Saya tidak ingin banyak sub-folder kosong.
Arete
48

Solusi Belisarius bagus.

Untuk menguraikan jawaban yang sedikit singkat itu:

  • /E membuat Robocopy menyalin subdirektori secara rekursif, termasuk yang kosong.
  • /XCmengecualikan file yang ada dengan stempel waktu yang sama, tetapi ukuran file berbeda. Robocopy biasanya menimpa itu.
  • /XNmengecualikan file yang sudah ada yang lebih baru dari salinan di direktori sumber. Robocopy biasanya menimpa itu.
  • /XOmengecualikan file yang ada yang lebih lama dari salinan di direktori sumber. Robocopy biasanya menimpa itu.

Dengan pengecualian kelas Berubah, Lebih Lama, dan Lebih Baru, Robocopy melakukan apa yang diinginkan pembuat aslinya - tanpa perlu memuat lingkungan skrip.

Air raksa
sumber
46

Anda bisa mencoba ini:

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

-ycukup meminta sebelum menimpa dan kita bisa menyalurkan n ke semua pertanyaan itu. Jadi ini pada dasarnya hanya menyalin file yang tidak ada. :)

sachin11
sumber
2
Sangat sederhana.
Holf
6
mengapa itu menjawab semua pertanyaan ketika kita hanya menyalurkan sekali?
phuclv
Luar biasa, saya memilih opsi ini. Sebelum memikirkan perpipaan, saya mencari parameter di Google yang menurut saya hilang dan kemudian saya menemukan halaman ini. Mencoba solusi ini saya perhatikan bahwa ketika mem-piping, copy tampaknya mengaktifkan parameter / Y, jadi itulah mengapa / -Y harus ditambahkan.
Andrew
2
@phuclv Sepertinya copy /-ysecara otomatis menganggap Tidak setelah stdin kehabisan masukan. Anda dapat menghilangkan eksplisit pertama n, atau menyalurkan < nulke dalamnya, dan hal yang sama terjadi.
mwfearnley
6

Ini dia dalam bentuk file batch:

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

Saya hanya ingin mengklarifikasi sesuatu dari pengujian saya sendiri.

@Hydrargyrum menulis:

  • / XN mengecualikan file yang sudah ada yang lebih baru dari salinan di direktori sumber. Robocopy biasanya menimpa itu.
  • / XO mengecualikan file yang sudah ada yang lebih lama dari salinan di direktori sumber. Robocopy biasanya menimpa itu.

Ini sebenarnya mundur. XN melakukan file "eXclude Newer" tetapi tidak menyertakan file yang lebih baru dari salinan di direktori tujuan . XO melakukan "eXclude Older", tetapi tidak menyertakan file yang lebih lama dari salinan di direktori tujuan .

Tentu saja lakukan pengujian Anda sendiri seperti biasa.

HailGallaxar
sumber
1
Apakah ini jawaban atas pertanyaan awal, atau komentar atas jawaban orang lain?
PESK
1
Apakah jawaban Hydrargyrum yang memiliki +25 suara pada saat menulis jawaban untuk pertanyaan asli, atau mengomentari jawaban orang lain?
mo.
3

Ada cara aneh untuk melakukan ini dengan xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Cukup sertakan sebanyak n sebagai file yang Anda salin, dan itu akan menjawab n untuk semua pertanyaan timpa.

Adam Says - Pulihkan Monica
sumber
Mengenai copy, lihat jawaban ini , khususnya komentar @mwfearnley: copy /-ysecara otomatis mengasumsikan nsetelah stdin habis, jadi Anda dapat misalnya echo nhanya sekali dan masih berfungsi.
rsenna
3
robocopy src dst /MIR /XX

/ XX: eXclude file dan direktori "eXtra" (ada di tujuan tetapi bukan sumber). Ini akan mencegah penghapusan dari tujuan. (ini defaultnya)

be_good_do_good
sumber
1

Robocopy dapat diunduh di sini untuk sistem yang belum diinstal. (Yaitu Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (tidak diperlukan booting ulang untuk instalasi)

Ingatlah untuk mengatur jalur Anda ke robocopy exe. Lakukan ini dengan mengklik kanan "komputer saya"> properti> lanjutan> "Variabel Lingkungan", lalu temukan variabel sistem jalur dan tambahkan ini di akhir: "; C: \ Program Files \ Windows Resource Kits \ Tools" atau di mana pun Anda menginstalnya. Pastikan untuk meninggalkan string variabel path yang sudah ada dan tambahkan path tambahan.

setelah jalur diatur, Anda dapat menjalankan perintah yang disarankan Belisarius. Ini bekerja dengan baik.

Greg
sumber
1

Itu tidak akan membiarkan saya berkomentar secara langsung pada pesan yang salah - tapi izinkan saya hanya memperingatkan semua orang, bahwa definisi opsi / XN dan / XO DIBALIKKAN dibandingkan dengan apa yang telah diposting di pesan sebelumnya.

Opsi Kecualikan file Lama / Baru konsisten dengan informasi yang ditampilkan di pencatatan RoboCopy: RoboCopy akan mengulang melalui SUMBER dan kemudian melaporkan apakah setiap file di SUMBER "LEBIH LAMA" atau "LEBIH BARU" daripada file di tujuan.

Akibatnya, / XO akan mengecualikan file SUMBER LAMA (yang intuitif), bukan "lebih tua dari sumber" seperti yang diklaim di sini.

Jika Anda hanya ingin menyalin file sumber baru atau yang diubah, tetapi menghindari mengganti file tujuan yang lebih baru, maka / XO adalah opsi yang tepat untuk digunakan.

Andy Schmidt
sumber
0

Pendekatan sederhana adalah menggunakan opsi / MIR, untuk mencerminkan dua direktori. Pada dasarnya ini hanya akan menyalin file baru ke tujuan. Di perintah berikutnya ganti sumber dan tujuan dengan jalur ke folder Anda, skrip akan mencari file apa pun dengan ekstensi apa pun.

robocopy <source directory> <destination directory> *.* /MIR
Ionut V.
sumber
0

Inilah yang berhasil bagi saya. Saya menggunakan ini untuk "menambahkan" file ke drive lain, tanpa menimpa.

File batch: 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"

Contoh:

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

Lakukan pengujian sebelum implementasi.

Ramesh
sumber