Sao chép tệp mà không ghi đè


99

Tôi dường như không thể tìm ra cách trên dòng lệnh để nói "sao chép tất cả các tệp từ thư mục A sang thư mục B, nhưng nếu tệp đã tồn tại trong thư mục B, đừng ghi đè lên nó, bất kể tệp nào mới hơn và đừng nhắc tôi. "

Tôi đã trải qua quá trình sao chép, di chuyển, xcopy & robocopy và điều gần nhất mà tôi có thể nhận được là bạn có thể nói với robocopy "sao chép A sang B, nhưng đừng ghi đè tệp mới hơn bằng tệp cũ hơn", nhưng điều đó không hiệu quả với tôi . Tôi đã xem xét xxcopy, nhưng đã loại bỏ nó, vì tôi không muốn có sự phụ thuộc của bên thứ ba vào sự kiện sau xây dựng Visual Studio sẽ yêu cầu người dùng SVN khác cài đặt công cụ đó để thực hiện xây dựng.

Tôi muốn thêm một dòng lệnh vào sự kiện sau tạo trong Visual Studio 2010 để các tệp được tạo từ mẫu T4 cho các đối tượng mô hình EF mới được phân phối đến các thư mục dự án mà chúng thuộc về, nhưng các tệp được tạo lại cho các đối tượng hiện có không ghi đè lên các tệp đích có thể được chỉnh sửa.

Vì mẫu T4 tái tạo, tệp nguồn luôn mới hơn và tôi không thể sử dụng công tắc "mới hơn" một cách đáng tin cậy, tôi không nghĩ vậy.

Tôi sử dụng các lớp từng phần cho những mục mà tôi có thể, nhưng có những thứ khác mà tôi tạo không thể sử dụng các lớp từng phần (ví dụ: tạo tệp EditorTemplate hoặc DisplayTemplate * .ascx mặc định).

Bất kỳ ai có bất kỳ vấn đề tương tự họ đã giải quyết?


Là bạn quen với cmd.exe's forlệnh? Nếu không, tôi khuyên bạn nên chạy for /?và sử dụng nó.
Gabe

Câu trả lời:


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

5
Điều này phù hợp với tôi, nhưng tôi phải sử dụng hai ký hiệu phần trăm thay vì một ký hiệu vì tôi đang chạy nó từ bên trong tệp lô chứ không phải dòng lệnh. Tôi đã thay thế các phiên bản% F bằng %% F và các phiên bản% ~ nxF bằng %% ~ nxF.
Owen

1
Không gì ~nxtrong %~nxFchính xác nghĩa là gì?
Serge Rogatch

@stu, nó chỉ nói rằng ~nxFbiến Fbiến thành tên tệp và phần mở rộng.
Serge Rogatch

Vâng, rất hiệu quả, hãy cung cấp cho tôi tên tệp + phần mở rộng, không có đường dẫn - đó là những gì bạn cần thực hiện kiểm tra trong thư mục đích và chỉ định tên tệp đích. Vấn đề là% F bao gồm đường dẫn và bạn không muốn nó ở đó.
Stu

207

Robocopy , hay "Robust File Copy", là một lệnh sao chép thư mục dòng lệnh. Nó đã có sẵn như một phần của Bộ tài nguyên Windows bắt đầu với Windows NT 4.0 và được giới thiệu như một tính năng tiêu chuẩn của Windows Vista, Windows 7 và Windows Server 2008.

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

Để giải thích (sử dụng câu trả lời của Hydrargyrum, HailGallaxar và Andy Schmidt):

  • /E làm cho Robocopy sao chép đệ quy các thư mục con, bao gồm cả các thư mục trống.
  • /XCloại trừ các tệp hiện có có cùng dấu thời gian nhưng kích thước tệp khác nhau. Robocopy thường ghi đè chúng.
  • /XNloại trừ các tệp hiện có mới hơn bản sao trong thư mục đích. Robocopy thường ghi đè chúng.
  • /XOloại trừ các tệp hiện có cũ hơn bản sao trong thư mục đích. Robocopy thường ghi đè chúng.

Với các lớp Thay đổi, Cũ hơn và Mới hơn bị loại trừ, Robocopy thực hiện chính xác những gì người đăng ban đầu muốn - mà không cần tải môi trường tập lệnh.

Tài liệu tham khảo: Technet , Wikipedia
Tải xuống từ: Liên kết tải xuống của Microsoft (Liên kết được xác minh lần cuối vào ngày 30 tháng 3 năm 2016)


Bằng cách 'loại trừ', bạn có nghĩa là 'bỏ qua' hay 'xóa / loại bỏ'?
oanh tạc

@Andre Terra: Bỏ qua, bình thường. Nếu bạn đang sử dụng cờ / MIR, nó có thể xóa chúng. Tôi đã không thử nghiệm điều đó.
Hydrargyrum

Với / MIR, các tệp không tồn tại trong nguồn thực sự bị xóa. Nhưng khi cũng sử dụng / XN và / XO, các tệp tồn tại ở cả hai nơi chỉ bị bỏ qua (không chắc liệu kích thước có được kiểm tra hay không). Điều này là lý tưởng cho tình huống của tôi khi tôi cần sao chép phiên bản mới hơn hoặc cũ hơn của ứng dụng nhưng tem dateModified của thư viện mà ứng dụng sử dụng không chính xác nhưng bản thân tên tệp chứa số phiên bản của chúng.
Henno Vermeulen

Có cần thiết phải bao gồm /ekhông? Nếu bạn sử dụng /sthay thế thì sao? Tôi không muốn có một loạt các thư mục con trống.
Arete

48

Giải pháp của Belisarius là tốt.

Để giải thích rõ hơn về câu trả lời hơi ngắn gọn đó:

  • /E làm cho Robocopy sao chép đệ quy các thư mục con, bao gồm cả các thư mục trống.
  • /XCloại trừ các tệp hiện có có cùng dấu thời gian nhưng kích thước tệp khác nhau. Robocopy thường ghi đè chúng.
  • /XNloại trừ các tệp hiện có mới hơn bản sao trong thư mục nguồn. Robocopy thường ghi đè chúng.
  • /XOloại trừ các tệp hiện có cũ hơn bản sao trong thư mục nguồn. Robocopy thường ghi đè chúng.

Với các lớp Thay đổi, Cũ hơn và Mới hơn bị loại trừ, Robocopy thực hiện chính xác những gì người đăng ban đầu muốn - mà không cần tải môi trường tập lệnh.


46

Bạn có thể thử điều này:

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

-ychỉ cần nhắc trước khi ghi đè và chúng ta có thể chuyển n cho tất cả các câu hỏi đó. Vì vậy, điều này về bản chất sẽ chỉ sao chép các tệp không tồn tại. :)


2
Đẹp một cách đơn giản.
Holf

6
tại sao nó trả lời tất cả các câu hỏi khi chúng ta chỉ tẩu một lần?
phuclv

Tuyệt vời, tôi đã chọn tùy chọn này. Trước khi nghĩ đến đường ống, tôi đã tìm kiếm một thông số mà tôi nghĩ rằng tôi bị thiếu và sau đó tôi xem trang này. Thử giải pháp này, tôi nhận thấy rằng khi đường ống, bản sao dường như đã bật tham số / Y, vì vậy đó là lý do tại sao phải thêm / -Y.
Andrew

2
@phuclv Có vẻ như copy /-ychỉ tự động giả định Không khi stdin hết đầu vào. Bạn có thể bỏ qua đầu tiên rõ ràng nhoặc đường ống dẫn < nulvào nó, và điều tương tự cũng xảy ra.
mwfearnley

6

Đây là dạng tệp hàng loạt:

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

3

Tôi chỉ muốn làm rõ điều gì đó từ thử nghiệm của riêng tôi.

@Hydrargyrum đã viết:

  • / XN loại trừ các tệp hiện có mới hơn bản sao trong thư mục nguồn. Robocopy thường ghi đè chúng.
  • / XO loại trừ các tệp hiện có cũ hơn bản sao trong thư mục nguồn. Robocopy thường ghi đè chúng.

Điều này thực sự là ngược. XN hiện các tệp "eXclude Newer" nhưng nó loại trừ các tệp mới hơn bản sao trong thư mục đích . XO thực hiện "eXclude Older", nhưng nó loại trừ các tệp cũ hơn bản sao trong thư mục đích .

Tất nhiên hãy làm thử nghiệm của riêng bạn như mọi khi.


1
Đây là câu trả lời cho câu hỏi ban đầu hay nhận xét về câu trả lời của người khác?
ASGM

1
Câu trả lời của Hydrargyrum có +25 phiếu bầu tính đến thời điểm viết câu trả lời cho câu hỏi ban đầu hay nhận xét về câu trả lời của người khác?
mo.

3

Có một cách kỳ lạ để làm điều này với xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Chỉ cần bao gồm nhiều n như các tệp bạn đang sao chép và nó sẽ trả lời n cho tất cả các câu hỏi ghi đè.


Về vấn đề copy, hãy xem câu trả lời này , cụ thể là bình luận @mwfearnley: copy /-ytự động giả định nmột khi stdin hết, vì vậy bạn có thể ví dụ: echo nchỉ một lần và nó vẫn hoạt động.
rsenna

3
robocopy src dst /MIR /XX

/ XX: eXclude tệp và dirs "eXtra" (hiển thị ở đích nhưng không có nguồn). Điều này sẽ ngăn chặn bất kỳ xóa nào khỏi đích. (đây là mặc định)


1

Robocopy có thể được tải xuống tại đây cho các hệ thống chưa được cài đặt. (Tức là Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=vi&id=17657 (không cần khởi động lại để cài đặt)

Hãy nhớ đặt đường dẫn của bạn đến exe robocopy. Bạn thực hiện việc này bằng cách nhấp chuột phải vào "máy tính của tôi"> thuộc tính> nâng cao> "Biến môi trường", sau đó tìm biến hệ thống đường dẫn và thêm biến này vào cuối: "; C: \ Program Files \ Windows Resource Kits \ Tools" hoặc bất cứ nơi nào bạn đã cài đặt nó. Đảm bảo để lại các chuỗi biến đường dẫn đã có và chỉ thêm đường dẫn bổ sung.

khi đường dẫn được thiết lập, bạn có thể chạy lệnh mà belisarius đề xuất. Nó hoạt động tuyệt vời.


1

Nó sẽ không cho phép tôi bình luận trực tiếp về các tin nhắn không chính xác - nhưng tôi chỉ cảnh báo mọi người rằng định nghĩa của các tùy chọn / XN và / XO đã được LẠI so với những gì đã được đăng trong các tin nhắn trước đó.

Tùy chọn Loại trừ tệp Cũ hơn / Mới hơn phù hợp với thông tin được hiển thị trong nhật ký của RoboCopy: RoboCopy sẽ lặp lại qua NGUỒN và sau đó báo cáo xem mỗi tệp trong NGUỒN là "CŨ hơn" hoặc "MỚI hơn" so với tệp trong đích.

Do đó, / XO sẽ loại trừ các tệp NGUỒN CŨ (trực quan), không "cũ hơn nguồn" như đã được xác nhận ở đây.

Nếu bạn chỉ muốn sao chép các tệp nguồn mới hoặc đã thay đổi, nhưng tránh thay thế các tệp đích mới hơn, thì / XO là tùy chọn chính xác để sử dụng.


0

Một cách tiếp cận đơn giản là sử dụng tùy chọn / MIR, để sao chép hai thư mục. Về cơ bản, nó sẽ chỉ sao chép các tệp mới đến đích. Trong lần kết hợp tiếp theo, thay thế nguồn và đích bằng các đường dẫn đến các thư mục của bạn, tập lệnh sẽ tìm kiếm bất kỳ tệp nào có bất kỳ phần mở rộng nào.

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

0

Đây là những gì đã làm việc cho tôi. Tôi sử dụng điều này để "thêm" tệp vào ổ đĩa khác mà không có ghi đè.

Tệp hàng loạt: robocopy-thiếufiles.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"

Thí dụ:

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

Làm thử nghiệm trước khi thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.