递归移动文件到文件夹

Recursively move file into folder

我需要有关此脚本的帮助。我需要递归地将一个特定文件移动到一个特定文件夹中。特定文件与特定文件夹位于同一文件夹中。

说清楚。

我试过这个,但它不能递归工作,当我将脚本添加到 Movie1 文件夹并从脚本中删除 cd Movie 文件夹时,它会将文件移动到该文件夹​​中。但我需要从 Root 开始 运行。感谢任何想法。

cd Movie folder
for /f "delims=" %%i in ('dir /b /s "Subtitles.srt"') do move "%%~i" "Subtitles"

你快到了

您需要第一行来选择性地强制脚本 cd 并在相对的本地驱动器中查找

然后添加相关子目录

cd /D "%~dp0"
for /f "delims=" %%i in ('dir /b /s "Subtitles.srt"') do move "%%~i" "%%~dpiSubtitles"

如果文件夹名称是 \Subtitles folder 那么您需要在末尾添加它,即 "%%~dpiSubtitles folder"

C:\Users>"E:\Movie folder\script.bat"

C:\Users>cd /D "E:\Movie folder\"

E:\Movie folder>for /F "delims=" %i in ('dir /b /s "Subtitles.srt"') do move "%~i" "%~dpiSubtitles"

E:\Movie folder>move "E:\Movie folder\Movie1\subtitles.srt" "E:\Movie folder\Movie1\Subtitles"
        1 file(s) moved.

E:\Movie folder>move "E:\Movie folder\Movie2\subtitles.srt" "E:\Movie folder\Movie2\Subtitles"
        1 file(s) moved.

E:\Movie folder>move "E:\Movie folder\Movie3\subtitles.srt" "E:\Movie folder\Movie3\Subtitles"
        1 file(s) moved.

E:\Movie folder>

你不应该递归搜索根目录,因为目标文件驻留在一定的层次结构深度:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=%~dp0Movie"    & rem /* (root directory containing the movie sub-directories;
                            rem     `%~dp0` points to the parent dir. of the script) */
set "_MDIR=Movie*"        & rem // (name or mask of movie sub-directories)
set "_SDIR=Subtitles"     & rem // (name of subtitles sub-sub-directory)
set "_NAME=Subtitles.srt" & rem // (pure name of the subtitles files)

rem // Iterate through the immediate sub-directories of the given root:
for /D %%J in ("%_ROOT%\%_MDIR%") do (
    rem // Check for existence of subtitles file:
    if exist "%%~J\%_NAME%" (
        rem // Check for non-existence of subtitles file to avoid overwriting:
        if not exist "%%~J\%_SDIR%\%_NAME%" (
            rem // Actually move subtitles file:
            move "%%~J\%_NAME%" "%%~J\%_SDIR%\%_NAME%"
        )
    )
)

endlocal
exit /B