かなり複雑なフォルダー構造に、大量のファイル (45,000 以上) があります。元のフォルダー パスとともにコピーしたい約 13,000 個のファイルとそのパス (ルート フォルダーを基準) のサブセットを抽出しました。
徹底的に検索しましたが、xcopy や robocopy を使って、必要なことを実行する方法を見つけることができませんでした。リスト内のエントリごとに 1 つのコピー コマンドを含むバッチ ファイルを簡単に作成できます。ただし、ソース ファイルからターゲットのフォルダー パスを生成する x/robocopy スイッチやスイッチの組み合わせを見つけることができませんでした。例:
xcopy dir1\dir2\dir3\file.txt copy_folder /<some switches>
または
xcopy dir1\dir2\dir3\file.txt copy_folder\dir1\dir2\dir3\file.txt /<some switches>
dir1\dir2\dir3
フォルダーの下にパスが存在しない場合はパスを作成しcopy_folder
、そこにコピーを配置したいと思いますfile.txt
。 Linux ではcp --parent
まさにそれが行われると理解しています。
これを実現するための最善の方法についてのご提案は大歓迎です!
答え1
XCOPY はフォルダーが存在しない場合はフォルダーを作成しますが、最初に宛先がファイルかディレクトリかを尋ねるプロンプトが表示されます。
したがって、コマンドが一時停止しないように、F 応答を XCOPY コマンドにパイプすることができます。
for /f "delims=" %%F in (yourList.txt) do echo f 2>nul | xcopy /y "%%~F" "copyFolder\%%~F"
この/Y
オプションは、リスト内に重複がある場合に使用されます。XCOPY コマンドで上書きするかどうかを尋ねるプロンプトが表示されないようにするためです。
パスが存在する場合、stderr を nul にリダイレクトする必要があります。その場合、右側が左側より先に完了し、左側が次のエラー メッセージを stderr に出力する可能性があります。The process tried to write to a nonexistent pipe.
リダイレクトにより、不要なエラー メッセージが非表示になります。
もう 1 つのオプションは、XCOPY を実行する前に、まず宛先パスを作成することです。パスがすでに存在する場合にエラー メッセージが表示されないようにするには、stderr を null にリダイレクトするだけです。
for /f "delims=" %%F in (yourList.txt) do (
md "copyFolder%%~pF" 2>nul
xcopy /y "%%~F" "copyFolder\%%~F"
)
"copyFolder%%~pnxF"
どちらのソリューションでも、リスト内のパスにドライブ文字が含まれている場合は、の代わりにを使用する必要があります"copyFolder\%%~F"
。~p
修飾子には先頭の が含まれることに注意してください\
。