上書きせずにファイルをコピーする


99

コマンドラインで「すべてのファイルをディレクトリAからディレクトリBにコピーする」という方法を見つけることができないようですが、ファイルがディレクトリBにすでに存在する場合は、どのファイルが新しいかに関係なく、上書きしないでください。 、私にプロンプ​​トを表示しないでください。」

私はコピー、移動、xcopy&robocopyを行ってきましたが、最も近いのはrobocopyに「AからBにコピーしますが、新しいファイルを古いファイルで上書きしないでください」と伝えることですが、それは私にとってはうまくいきません。 。xxcopyを確認しましたが、Visual Studioのビルド後のイベントにサードパーティの依存関係を持たせたくないため、他のSVNユーザーがビルドを実行するためにそのツールをインストールする必要があるため、xxcopyを破棄しました。

コマンドラインをVisual Studio 2010のビルド後のイベントに追加して、新しいEFモデルオブジェクトのT4テンプレートから生成されたファイルが、それらが属するプロジェクトフォルダーに配布され、既存のオブジェクトのファイルが再生成されるようにします編集された可能性のある宛先ファイルを上書きしないでください。

T4テンプレートが再生成されるため、ソースファイルは常に新しいものになり、「新しい」スイッチを確実に使用することはできないと思います。

使用できる項目に部分クラスを使用していますが、部分クラスを使用できないものを生成しています(たとえば、デフォルトのEditorTemplateまたはDisplayTemplate * .ascxファイルを生成します)。

誰かが解決した同様の問題がありますか?


cmd.exeforコマンドを知っていますか?そうでない場合は、実行for /?して使用することをお勧めします。
ゲイブ

回答:


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

5
これは私にとってはうまくいきましたが、コマンドラインではなくバッチファイル内からこれを実行していたため、1記号ではなく2パーセント記号を使用する必要がありました。%Fのインスタンスを%% Fに、%〜nxFのインスタンスを%%〜nxFに置き換えました。
オーウェン

1
何を~nxして%~nxF正確に意味ですか?
セルジュロガッチ2016

@stuは~nxF、変数Fがファイル名と拡張子に変わることだけを示しています。
セルジュロガッチ2016

はい、効果的に、パスなしでファイル名+拡張子を指定します-これは、ターゲットフォルダーでテストを実行し、ターゲットファイル名を指定するために必要なものです。重要なのは、%Fにパスが含まれていて、そこにパスを入れたくないということです。
Stu 2016

207

Robocopyまたは「ロバストファイルコピー」は、コマンドラインのディレクトリ複製コマンドです。これは、Windows NT 4.0以降のWindowsリソースキットの一部として利用でき、Windows Vista、Windows 7、およびWindows Server 2008の標準機能として導入されました。

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

詳しく説明するには(Hydrargyrum、HailGallaxar、Andy Schmidtの回答を使用):

  • /E Robocopyに空のサブディレクトリを含むサブディレクトリを再帰的にコピーさせます。
  • /XCタイムスタンプは同じでファイルサイズが異なる既存のファイルを除外します。Robocopyは通常それらを上書きします。
  • /XNコピー先よりも新しい既存のファイルを除外します。Robocopyは通常それらを上書きします。
  • /XOコピー先のディレクトリにあるコピーより古い既存のファイルを除外します。Robocopyは通常それらを上書きします。

Changed、Older、およびNewerクラスを除外すると、Robocopyは、スクリプト環境をロードする必要なく、元の投稿者が望んでいることを正確に実行します。

参照:TechnetWikipedia
ダウンロード元:Microsoftダウンロードリンク (リンクの最終確認日:2016年3月30日)


「除外」とは、「スキップ」または「削除/削除」を意味しますか?
2013年

@Andre Terra:通常はスキップします。/ MIRフラグを使用している場合は、それらが削除される可能性があります。私はそれをテストしていません。
Hydrargyrum

/ MIRを使用すると、ソースに存在しないファイルは実際に削除されます。ただし、/ XNおよび/ XOも使用する場合、両方の場所に存在するファイルは単にスキップされます(サイズがチェックされているかどうかは不明です)。これは、アプリケーションの新しいバージョンまたは古いバージョンをコピーする必要があるが、アプリケーションが使用するライブラリのdateModifiedスタンプが正しくないにもかかわらず、ファイル名自体にバージョン番号が含まれている状況に最適です。
Henno Vermeulen

含める必要はあり/eますか?/s代わりに使用するとどうなりますか?空のサブフォルダをたくさん入れたくありません。
アレテ

48

ベリサリウスの解は良いです。

その少し簡潔な答えについて詳しく説明するには:

  • /E Robocopyに空のサブディレクトリを含むサブディレクトリを再帰的にコピーさせます。
  • /XCタイムスタンプは同じでファイルサイズが異なる既存のファイルを除外します。Robocopyは通常それらを上書きします。
  • /XNソースディレクトリ内のコピーより新しい既存のファイルを除外します。Robocopyは通常それらを上書きします。
  • /XOソースディレクトリのコピーより古い既存のファイルを除外します。Robocopyは通常それらを上書きします。

Changed、Older、およびNewerクラスを除外すると、Robocopyは、スクリプト環境をロードする必要なく、元の投稿者が望んでいることを正確に実行します。


46

あなたはこれを試すことができます:

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

-y上書きする前にプロンプ​​トを表示するだけで、それらすべての質問にnをパイプできます。したがって、これは本質的には存在しないファイルをコピーするだけです。:)


2
美しくシンプル。
Holf、2016年

6
パイプするのが1度だけなのになぜすべての質問に答えるのですか
phuclv 2017年

すごい、私はこのオプションを選びました。パイピングを考える前に、私は自分が不足していると思っていたパラメーターを探して、このページに出くわしました。このソリューションを試してみたところ、パイピング時にコピーによって/ Yパラメータが明らかに有効になるため、/-Yを追加する必要があることがわかりました。
Andrew

2
@phuclv copy /-ystdinの入力が不足すると、自動的にNo と見なされるようです。最初の明示的なを省略しnたり< nul、それにパイプしたりしても、同じことが起こります。
mwfearnley

6

ここでは、バッチファイル形式です。

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

3

私は自分のテストから何かを明らかにしたいだけです。

@Hydrargyrumが書いた:

  • / XNは、ソースディレクトリのコピーよりも新しい既存のファイルを除外します。Robocopyは通常それらを上書きします。
  • / XOは、ソースディレクトリのコピーより古い既存のファイルを除外します。Robocopyは通常それらを上書きします。

これは実際には逆です。XNは「eXclude Newer」ファイルを実行しますが、宛先ディレクトリのコピーより新しいファイルを除外します。XOは「古いものを除外」しますが、宛先のコピーより古いファイルは除外しますディレクトリーの。

もちろん、いつものように独自のテストを行ってください。


1
これは元の質問に対する回答ですか、それとも他の人の回答に対するコメントですか?
ASGM 2013

1
元の質問への回答を書き込んだ時点で+25票を獲得したHydrargyrumの回答ですか、それとも他の人の回答に対するコメントですか?
mo。

3

xcopyでこれを行うには奇妙な方法があります。

echo nnnnnnnnnnn | xcopy /-y source target

コピーするファイルと同じ数のnを含めるだけで、すべての上書きの質問にnと答えます。


についてはcopyこの回答、特に@mwfearnleyコメントを参照してください。stdin が使い果たされるとcopy /-y自動的に想定さnれるため、たとえばecho n1回だけ実行しても機能します。
rsenna

3
robocopy src dst /MIR /XX

/ XX: "eXtra"ファイルとディレクトリを除外します(宛先には存在しますが、ソースには存在しません)。これにより、宛先からの削除が防止されます。(これがデフォルトです)


1

Robocopyは、まだインストールされていないシステム用にここからダウンロードできます。(つまり、Windows Server 2003)。

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (インストールに再起動は必要ありません)

robocopy exeへのパスを設定することを忘れないでください。これを行うには、「マイコンピュータ」>「プロパティ」>「詳細」>「環境変数」を右クリックして、パスシステム変数を見つけ、これを末尾に追加します。「; C:\ Program Files \ Windows Resource Kits \ Tools」またはどこにでもそれをインストールしました。すでに存在するパス変数文字列を残し、追加のパスを追加することを確認してください。

パスが設定されると、belisariusが提案するコマンドを実行できます。それは素晴らしい働きをします。


1

間違ったメッセージに直接コメントすることはできませんが、/ XNおよび/ XOオプションの定義が前のメッセージに投稿されたものと比較して逆転されていることを皆さんに警告します。

[古い/新しいファイルを除外する]オプションは、RoboCopyのログに表示される情報と一致しています。RoboCopyはSOURCEを反復処理し、SOURCEの各ファイルが宛先のファイルより「古い」か「新しい」かを報告します。

したがって、/ XOはOLDER SOURCEファイル(直感的)を除外し、ここで要求されている「ソースより古い」ファイルを除外します。

新しいソースファイルまたは変更されたソースファイルのみをコピーするが、最新の宛先ファイルの置き換えは避けたい場合は、/ XOが正しいオプションです。


0

簡単な方法は、/ MIRオプションを使用して、2つのディレクトリをミラーリングすることです。基本的には、新しいファイルのみを宛先にコピーします。次のコマンドで、ソースと宛先をフォルダーへのパスに置き換えます。スクリプトは、任意の拡張子を持つファイルを検索します。

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

0

これは私のために働いたものです。これを使用して、ファイルを上書きせずに他のドライブに「追加」します。

バッチファイル: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"

例:

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

実装前にテストを行ってください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.