使用递归循环的批处理文件来移动文件

使用递归循环的批处理文件来移动文件

我正在尝试创建一个批处理脚本,根据搜索条件将文件移动到同一子文件夹结构的另一个文件夹中。

尝试了以下方法,但结果不太正确。

for /r "c:\Test_Copy\Source1\" %%x in (Test*.txt) do move "%%x" "c:\Test_Copy\Target1\"

正如它所显示的:

move "c:\Test_Copy\Source1\Sub1\Test1.txt" "c:\Test_Copy\Target1\"
move "c:\Test_Copy\Source1\Sub2\Test1.txt" "c:\Test_Copy\Target1\" 

我希望结果如下:

move "c:\Test_Copy\Source1\Sub1\Test1.txt" "c:\Test_Copy\Target1\Sub1\Test1.txt"
move "c:\Test_Copy\Source1\Sub2\Test1.txt" "c:\Test_Copy\Target1\Sub2\Test1.txt"

我怎样才能实现这个目标?

谢谢

答案1

@echo off 

for /D /R "c:\Test_Copy\Source1\" %%I in (*)do pushd "%%~I" & (
    2>nul >nul mkdir "c:\Test_Copy\Target1\%%~nxI" 
    move "%%~I\Test*.txt" "c:\Test_Copy\Target1\%%~nxI" & popd
   )
  • 输出命令循环结果:
move "c:\Test_Copy\Source1\Sub1\test_001.txt" "c:\Test_Copy\Target1\Sub1\test_001.txt"
move "c:\Test_Copy\Source1\Sub1\test_002.txt" "c:\Test_Copy\Target1\Sub1\test_002.txt"
move "c:\Test_Copy\Source1\Sub1\test_003.txt" "c:\Test_Copy\Target1\Sub1\test_003.txt"
move "c:\Test_Copy\Source1\Sub2\test_001.txt" "c:\Test_Copy\Target1\Sub2\test_001.txt"
move "c:\Test_Copy\Source1\Sub2\test_002.txt" "c:\Test_Copy\Target1\Sub2\test_002.txt"
move "c:\Test_Copy\Source1\Sub2\test_003.txt" "c:\Test_Copy\Target1\Sub2\test_003.txt"
  • 命令move结果:
c:\Test_Copy\Source1\Sub1\test_001.txt
c:\Test_Copy\Source1\Sub1\test_002.txt
c:\Test_Copy\Source1\Sub1\test_003.txt
        3 file(s) moved.
c:\Test_Copy\Source1\Sub2\test_001.txt
c:\Test_Copy\Source1\Sub2\test_002.txt
c:\Test_Copy\Source1\Sub2\test_003.txt
        3 file(s) moved.

观察:如果您的所有子文件夹c:\Test_Copy\Target1\Sub[n]已经存在,删除行2>nul >nul mkdir "c:\Test_Copy\Target1\%%~nxI"

@echo off 

For /D /R "c:\Test_Copy\Source1\" %%I in (*)do pushd "%%~I" & (
    move "%%~I\Test*.txt" "c:\Test_Copy\Target1\%%~nxI" & popd
   )
  • 尝试使用for /D /R
FOR /R - Loop through files (recursively)
FOR /D - Loop through several folders/directories

选项/D /R未记录的,但可以是一个有用的组合,而它将递归遍历所有子文件夹通配符仅匹配文件夹/目录名称(不是文件名)

来源链接ss64.com

Rem :: Set your folder /Directory /Recursively tree starting at "c:\Test_Copy\Source1"
For /D /R "c:\Test_Copy\Source1"

相关内容