迭代子文件夹

时间:2016-10-17 13:52:56

标签: batch-file for-loop directory

我有一个文件夹结构如下:

c:/
  myDir/
    matchingDirName/
      myFile1.ext
    notMatchingDirName/
      myFile2.ext
  anotherDir/
    matchingDirName/
      myFile3.ext

我想要的是获取位于任何父目录中子文件夹ext中的给定扩展名matchingDirName的所有文件。

所以我需要某种文件模式,如下所示:<folder>/matchingDirName/*.ext

我已经尝试了这个,这给了我找不到文件

cd c:
for /f %%i in ('dir /a-h-s /b "*/matchingDirName/*.ext"') do echo %%i

有没有办法只获取位于给定文件夹中的那些文件?

在我的示例中,应返回myFile1.extmyFile3.ext

2 个答案:

答案 0 :(得分:1)

如果目录层次结构深度与样本中显示的完全相同,则以下方法有效:

@echo off
for /D %%A in ("C:\*.*") do (
    for /D %%B in ("%%~fA\*.*") do (
        if /I "%%~nxB"=="matchingDirName" (
            for %%C in ("%%~fB\*.ext") do (
                echo "%%~fC"
            )
        )
    )
)

前两个嵌套for /D循环枚举第一个和第二个目录层次结构级别的目录(/D)。 if /I查询以不区分大小写的方式(%%~nxB)针对预定义名称检查纯二级目录名称(/I)。最内层for循环最终遍历匹配目录中的所有*.ext文件。

对于任意目录层次结构深度,请使用以下命令:

@echo off
for /R "C:\" %%A in ("*.ext") do (
    for %%B in ("%%~dpA.") do (
        if /I "%%~nxB"=="matchingDirName" (
            echo "%%~fA"
        )
    )
)

外部for /R循环以递归方式枚举整个目录层次结构中的所有*.ext个文件(/R)。内部for循环接收每个*.ext文件(%%~dpA.)的父目录,因此它仅对每个文件迭代一次;例如,当前文件为C:\myDir\matchingDirName\myFile1.ext,因此%%~dpA.扩展为C:\myDir\matchingDirName\.,相当于C:\myDir\matchingDirName;此循环的目的是提取纯目录名称(%%~nxB;例如,matchingDirName)。 if /I查询最终以不区分大小写的方式(/I)检查该目录名与预定义名称。

答案 1 :(得分:0)

dir /s /b /a-d c:\*.ext | findstr /r /c:"\\matchingDirName\\[^\\]*$"

搜索所有ext文件并使用正则表达式过滤列表,以仅打印存储在匹配目录名称中的那些文件

现在,迭代批处理文件中的列表

for /f "delims=" %%a in ('
    dir /s /b /a-d c:\*.ext ^| findstr /r /c:"\\matchingDirName\\[^\\]*$"
') do (
    echo File found : "%%a"
)