我有一个文件夹结构如下:
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.ext
和myFile3.ext
。
答案 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"
)