在命令提示符中递归获取裸文件名

在命令提示符中递归获取裸文件名

我在尝试以递归方式获取文件名(没有扩展名或文件路径)时遇到了一个小问题。这对我在根文件夹中有效:

dir /b

但是当我添加 /s 进行递归扫描时,我也得到了不需要的文件名之前的文件路径。有没有办法从目录中的所有子文件夹中获取裸文件名?

我在 Windows 7 x64 上,我宁愿使用常规命令提示符而不是 PS 或 VBS

答案1

使用以下命令:

dir /b /a /s
  • /b从输出中删除日期和其他详细信息
  • /A仅输出文件名,不输出路径
  • /秒启用递归目录列表

如果需要将输出保存到文件,可以使用:

dir /b /a /s >> list_of_names.txt

编辑实际上,上述解决方案并未达到原始问题的目标。我从问题中注意到的一件事是,帖子要求递归列表。而另一个答案则没有,所以我认为在其他回答者的答案中添加“/s”就可以了

for /f %a in ('dir /b /s') do @echo %~na

答案2

尝试这个:

for /f "delims=" %a in ('dir /b /s') do @echo %~na

有关如何工作以及它正在做什么的更多信息,请输入for /?

答案3

for /r %i in (*) do @echo %~ni

或者

forfiles /s /c "cmd /c if @isdir==FALSE noquotes.bat @fname"

假设noquotes.bat你的%小路%有此内容

@echo %~1

/r 方法解释

for /r递归遍历当前目录(您可以指定一个目录for /r drive:\path\,假定为当前目录)并对集合中匹配的每个文件执行 do 指定的命令(*)。该集合(.)将仅匹配目录。@echo %~ni 此命令在提示符下按原样运行。如果您将其放在批处理文件中,请将引号加倍。即for /r %%i in (*) do @echo %%~ni

forfiles 方法解释

/s枚举当前目录和所有子目录
/c执行引号内的命令
@isdir,并且@fname是发出到命令字符串中的符号
额外的批处理文件noquotes.bat通过使用 %~1 (参数 1) 删除双引号来提供帮助,
forfiles还允许您指定要从哪里开始的路径forfiles /P C:\Windows ...

答案4

使用属性(非目录)递归列出所有文件(仅限文件)

目录/B/S/A:-D

C:\test\cache>dir /B /S /A:-D

C:\test\cache\7\0f\7b50ed0522645513da90345120eaf0f7 C:\test\cache\d\23\814644aa6a8195c91e54d2f7bb64e23d

相关内容