あるフォルダーから、そのファイルが元々あった複数の他のフォルダーにファイルをコピーします。Windows

あるフォルダーから、そのファイルが元々あった複数の他のフォルダーにファイルをコピーします。Windows

こんにちは、次のような問題があります

異なるファイル (すべてのファイルの名前は異なりますが、拡張子は同じである可能性があります) を含む Windows フォルダー構造があるとします。

dirA
  subDirA
    file1.png
    file2.dds
  file3.jpeg
dirB
  subDirB
    subSubDirB
      file4.tiff
    some_txt.txt
  test.cfg
final.docx

そして、すべてのファイルを再帰的に別のディレクトリにコピーします。

file1.png
file2.dds
file3.jpeg
file4.tiff
some_txt.txt
test.cfg
final.docx

そして今、私がやりたいことは、これらのファイルすべてを元のフォルダにコピーし(以前のフォルダとファイルはまだそこに残っていることに注意してください。単にコピーしただけです)、以前のファイルを上書きすることです。実際には、ファイルの数は多いので、手動で操作することはできません。

これを行う簡単な方法はありますか、それともカスタム プログラム/スクリプトを作成したほうがよいでしょうか?

答え1

通常、次のような場合にはバッチ ソリューションを好みます。

@echo off

set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"

for /r "%orig%" %%A in (*) do (
    if exist "%dir%\%%~nxA" copy /y "%dir%\%%~nxA" "%%A"
)

変数origは、再帰的にループする最上位のフォルダーになります (つまり、dirAまたはdirB例のブロックから - または、フォルダーを共有している場合は、名前が重複していないことを確信している限り、好きなだけ上まで移動できます)。変数は、dir以前にすべてのファイルをコピーしたフォルダーになります。

for /rループする全てディレクトリ (origおよびそのすべてのサブフォルダ) をルートとするファイル。各反復で、ファイルの完全なパスと拡張子を に設定し%%A、ループ内で%%~nxA(名前と拡張子に短縮されたファイル) が指定したdir場所に存在するかどうかを確認します。存在する場合は、そのファイルを から の場所dir自体にコピーしますorig。これで完了です。ログ ファイルを生成して確認する場合は、通常、robocopy を使用して、ループからのすべてをテキスト ファイルに出力することをお勧めします。出力は次のようになります。

@echo off

set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"

setlocal enabledelayedexpansion
for /r "%orig%" %%A in (*) do (
    set "path=%%~dpA"
    if exist "%dir%\%%~nxA" robocopy "%dir%" "!path:~0,-1!" "%%~nxA"
)>>"%dir%\Return Files.txt"

\唯一の微妙な違いは、遅延拡張を有効にして、末尾をクリップできるようにすることです%%~dpA

答え2

あなたがやりたいことは不可能です。新しい場所にあるファイルには、そのファイルの出所に関する情報がもうありません。つまり、スクリプトが各ファイルをどこに配置すべきかを知る方法がないということです。

古いディレクトリ リストがある場合は、スクリプト言語を使用して簡単に実行できます。

答え3

名前の重複がないことを保証する場合は、次のようなものを使用します。

forfiles /P X:\originals_folder /S /C "cmd /c copy Y:\copies_folder\@file @path\@file /Y"

答え4

ハッシュテーブルを使用してパスを検索する PowerShell ソリューション:

$originals = 'c:\originals'
$copies    = 'c:\copies'
$hash = @{}
gci $originals -recurse | %{
   $hash[$_.name] = $_.Fullname
}
gci $copies | %{copy-item $_ $hash[$_.Name] -force

関連情報