DOSの単一のコマンドでこれを行う方法はありません。必要なのは、次のようなスクリプトです。これは、次のように、収集しようとしているツリーのルートフォルダーで実行できます。
batch.bat x*.*
現在のディレクトリとすべてのサブディレクトリでx*。*に一致するすべてのファイルを再帰的に収集します。これらは次の形式で保存されます。
folder1\x1.txt - > folder1x1.txt
folder2\x5.txt - > folder2x5.txt
folder3\x1.txt - > folder3x1.txt
コードは次のとおりです。
@echo off
FOR /F "delims=" %%I IN ('DIR .\%1 /B /AA /S') DO (CALL :COPYFILE %%I)
GOTO END
:COPYFILE
set "ofn=%~1"
set "fn=%~1"
call:MakeRelative fn
set fn=%fn:\=%
set fn=%fn::=%
copy %ofn% %fn%
goto:eof
:MakeRelative file base -- makes a file name relative to a base path
:: -- file [in,out] - variable with file name to be converted, or file name itself for result in stdout
:: -- base [in,opt] - base path, leave blank for current directory
:$created 20060101 :$changed 20080219 :$categories Path
:$source http://www.dostips.com
SETLOCAL ENABLEDELAYEDEXPANSION
set src=%~1
if defined %1 set src=!%~1!
set bas=%~2
if not defined bas set bas=%cd%
for /f "tokens=*" %%a in ("%src%") do set src=%%~fa
for /f "tokens=*" %%a in ("%bas%") do set bas=%%~fa
set mat=&rem variable to store matching part of the name
set upp=&rem variable to reference a parent
for /f "tokens=*" %%a in ('echo.%bas:\=^&echo.%') do (
set sub=!sub!%%a\
call set tmp=%%src:!sub!=%%
if "!tmp!" NEQ "!src!" (set mat=!sub!)ELSE (set upp=!upp!..\)
)
set src=%upp%!src:%mat%=!
( ENDLOCAL & REM RETURN VALUES
IF defined %1 (SET %~1=%src%) ELSE ECHO.%src%
)
EXIT /b
:END
お役に立てれば!