
こんにちは、次のような問題があります
異なるファイル (すべてのファイルの名前は異なりますが、拡張子は同じである可能性があります) を含む 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