如何将多个子文件夹中的特定文件移动到各自的父文件夹? (Windows批处理)

我有以下文件和文件夹结构(使用实名):

Carabidae/Pterostichinae/FolderNameXXX/dor/StackXXX/files.tif 

我的问题是,我需要从StackXXX文件夹中获取一个特定的文件,PM *。*到各自的/ dor父文件夹中。 StackXXX文件夹可以被删除。

有数百个FolderName。 理想情况下,我想要一个batch file,我可以从Carabidae文件夹运行。

这需要是一个batch file,因为会不断添加新的FolderNames。

经过大量的search之后,我从这个StackOverflow的答案中find了一个半工作的解决scheme:

 for /f "delims==" %%i in ('dir /a:d /b') do for /f "delims==" %%f in ('dir %%i /a:d /b') do (move "%%i\%%f\PM*.*" "%%i"&&rd "%%i\%%f" /s /q) 

它移动文件并删除文件夹,就像我想要的。 但问题是,它只能在从FolderName文件夹运行时起作用,这会影响脚本的节省时间的目的。 我不知道如何修改它以recursion到子文件夹,所以我可以从顶部文件夹运行它。

非常感谢您的帮助!

Solutions Collecting From Web of "如何将多个子文件夹中的特定文件移动到各自的父文件夹? (Windows批处理)"

这是一个可能的解决方案,因为只有路径示例中的XXX部分是可变的:

 rem // Enumerate `FolderName*` directories: for /D %%R in ("Carabidae\Pterostichinae\FolderName*") do ( rem // Enumerate `Stack*` sub-directories within `dor` sub-directories: for /F "delims= eol=|" %%D in ('dir /B /A:D "%%~R\dor\Stack*"') do ( rem // Check for `PM*.*` files in `Stack*` sub-directories: ( rem // Enumerate `PM*.*` files: for /F "delims= eol=|" %%F in ('dir /B /A:-D "%%~R\dor\%%D\PM*.*"') do ( rem /* Move `PM*.*` file one directory level up, overwriting rem an already existing file, if applicable: */ ECHO move /Y "%%~R\dor\%%D\%%F" "%%~R\dor\%%F" ) ) && ( rem /* Remove `Stack*` sub-directory after file movement; rem this is skipped if no `PM*.*` files have been found in the `Stack*` rem sub-directory, so when the `for /F %%F` loop did never iterate: */ ECHO rd /S /Q "%%~R\dor\%%D" ) ) ) 

在成功测试了是否返回了正确的项目之后, 删除大写ECHO命令以实际移动PM*.*文件并删除Stack*目录!

 @ECHO OFF SETLOCAL SET "sourcedir=u:\Carabidae" FOR /f "tokens=1*delims=" %%a IN ( 'dir /b /s /ad "%sourcedir%\pm*.*" ' ) DO IF EXIST "%%a" ( FOR %%p IN ("%%~dpa..\.") DO IF /i "%%~nxp"=="dor" ( ECHO %%a|FINDSTR /i "\\dor\\Stack" >NUL IF NOT ERRORLEVEL 1 ( ECHO MOVE /y "%%~dpa\pm*.*" "%%~dpa..\" ECHO RD /s /q "%%~dpa" ) ) ) GOTO :EOF 

您需要更改sourcedir的设置以适应您的情况。

找到所有的pm*.*文件,文件名到%%a

确保父目录是dor并确保\dor\stack\位于路径中。 如果是这样,移动文件并删除目录。

if exist目标目录包含多于一个pm*.*文件, if exist确保没有hiccoughs。

为了测试目的,所需的MOVE命令仅仅是ECHO在确认命令正确之后 ,将ECHO(MOVEMOVE移动文件实际移动)。Append >nul取消报告消息(例如1 file moved

为了测试目的,所需的RD命令仅仅是ECHO在确认命令正确后 ,将ECHO(RD改为RD ,实际删除目录。

如果需要,在move命令的末尾添加>nul来抑制移动报告。

像往常一样,我建议你先测试一个代表性的子树。