Вот пакетный скрипт Windows для этого.
Этот первый сценарий будет перемещать файлы только внутри структуры каталогов, аналогичной той, которая показана в вопросе OP.
Измените значение переменной сценария "topfolder", чтобы она содержала "базовую папку" для структуры каталогов.
Измените значение переменной сценария "subfolderprefix", чтобы оно содержало общий префикс для папок "первого уровня", которые нужно искать в "topfolder". В вопросе OP этот "префикс" был "папкой", но при необходимости его можно изменить на любую строку. Используя, например, "folder" в качестве префикса, скрипт будет искать папки следующим образом:
top_folder
folder1
folder2
folder3
folder99
folderABC
но другие папки в "top_folder" будут пропущены, например:
top_folder
somefolder
someotherfolder
Подпапки "второго уровня", в которых будут выполняться поиск файлов, имеют общий префикс родительского имени папки, за которым следует "_" (folder1\folder1_xxx
). Опять же, любые другие папки будут пропущены:
top_folder
folder1
folder1_2
(Files here will be moved to "folder1")
folder1_99
(Files here will be moved to "folder1")
folder1_ABC
(Files here will be moved to "folder1")
folder2
folder2_2
(Files here will be moved to "folder2")
somesubfolder
(Files here will be skipped)
folder3
folder3_1
(Files here will be moved to "folder3")
folder3_2
(Files here will be moved to "folder3")
folder99
folder99_XYZ
(Files here will be moved to "folder99")
folderABC
folderABC_123
(Files here will be moved to "folderABC")
somefolder
(Folders here will be skipped)
someotherfolder
(Folders here will be skipped)
Вот пакетный скрипт:
@echo off
set "topfolder=C:\Temp\SU373589\top_folder"
set "subfolderprefix=folder"
set "startdir=%CD%"
cd /d "%topfolder%"
set ctoptest=0
set cfilecount=0
for /d %%f in ("%subfolderprefix%*") do call :worklevel1 "%%~f"
if %ctoptest% EQU 0 echo There are no matching subfolders in "%topfolder%".
if %cfilecount% EQU 0 echo There were no files moved.
if %cfilecount% EQU 1 echo %cfilecount% file was moved.
if %cfilecount% GEQ 2 echo %cfilecount% files were moved.
cd /d "%startdir%"
goto :EOF
:worklevel1
set "subfolder=%~1"
set /a ctoptest+=1
echo Processing subfolder "%subfolder%" ...
set "subsubfolderprefix=%subfolder%\%subfolder%_"
set cwork1test=0
for /d %%g in ("%subsubfolderprefix%*") do call :worklevel2 "%%~g"
if %cwork1test% EQU 0 echo There are no matching subfolders in "%subfolder%"
echo.
set "subfolder="
set "subsubfolderprefix="
set cwork1test=
goto :EOF
:worklevel2
set "subsubfolder=%~1"
set /a cwork1test+=1
echo Processing subsubfolder "%subsubfolder%" ...
set cwork2test=0
for %%h in ("%subsubfolder%\*") do call :workmove "%%~h"
if %cwork2test% EQU 0 echo There are no files to move in "%subsubfolder%"
set "subsubfolder="
set cwork2test=
goto :EOF
:workmove
set "targetfile=%~1"
set /a cwork2test+=1
set /a cfilecount+=1
echo Moving file "%targetfile%" to "%subfolder%" (%cwork2test%)...
move "%targetfile%" "%subfolder%" >nul 2>&1
set "targetfile="
goto :EOF
Этот второй пакетный скрипт будет работать аналогичным образом, просматривая ВСЕ подпапки "первого уровня" и перемещая все файлы из всех подпапок "второго уровня" в подпапки "первого уровня". Он не будет соответствовать ни одному из префиксов ни одному из следующих имен.
Измените значение переменной сценария "topfolder", чтобы она содержала базовую папку для структуры каталогов.
@echo off
set "topfolder=C:\Temp\SE373589\top_folder"
set "startdir=%CD%"
cd /d "%topfolder%"
set ctoptest=0
set cfilecount=0
for /d %%f in ("*") do call :worklevel1 "%%~f"
if %ctoptest% EQU 0 echo There are no matching subfolders in "%topfolder%".
if %cfilecount% EQU 0 echo There were no files moved.
if %cfilecount% EQU 1 echo %cfilecount% file was moved.
if %cfilecount% GEQ 2 echo %cfilecount% files were moved.
cd /d "%startdir%"
goto :EOF
:worklevel1
set "subfolder=%~1"
set /a ctoptest+=1
echo Processing subfolder "%subfolder%" ...
set cwork1test=0
for /d %%g in ("%subfolder%\*") do call :worklevel2 "%%~g"
if %cwork1test% EQU 0 echo There are no matching subfolders in "%subfolder%"
echo.
set "subfolder="
set cwork1test=
goto :EOF
:worklevel2
set "subsubfolder=%~1"
set /a cwork1test+=1
echo Processing subsubfolder "%subsubfolder%" ...
set cwork2test=0
for %%h in ("%subsubfolder%\*") do call :workmove "%%~h"
if %cwork2test% EQU 0 echo There are no files to move in "%subsubfolder%"
set "subsubfolder="
set cwork2test=
goto :EOF
:workmove
set "targetfile=%~1"
set /a cwork2test+=1
set /a cfilecount+=1
echo Moving file "%targetfile%" to "%subfolder%" (%cwork2test%)...
move "%targetfile%" "%subfolder%" >nul 2>&1
set "targetfile="
goto :EOF
Более простая версия пакетного скрипта без проверки пустых папок и т.д.:
@echo off
set "topfolder=C:\Temp\SE373589\top_folder"
set "startdir=%CD%"
cd /d "%topfolder%"
for /d %%f in (*) do (
echo Processing folder: "%%~f"
for /d %%g in ("%%f\*") do (
echo Processing sub-folder: "%%~g"
for %%h in ("%%~g\*") do (
echo Moving file: "%%~h" to "%%~f"
move "%%~h" "%%~f" >nul 2>&1
)
)
echo.
)
cd /d "%startdir%"
И, наконец, "минимальный" сценарий без обмена сообщениями и при условии, что вы уже находитесь в нужной "базовой папке":
@echo off
for /d %%f in (*) do (
for /d %%g in ("%%f\*") do (
for %%h in ("%%~g\*") do move "%%~h" "%%~f" >nul 2>&1
)
)
И, на случай, если вы ожидаете этого, "один вкладыш" можно запустить из командной строки:
@for /d %f in (*) do @(for /d %g in ("%f\*") do @(for %h in ("%~g\*") do @move "%~h" "%~f" >nul 2>&1))