20

I ran into a little snag trying to get only the filenames (no extensions or file paths) recursively.This worked for me in the root folder:

dir /b

But when i added /s to scan recursively i also got file paths before filenames which i do not want. Is there a way to get bare filenames from all subfolders in a directory?

Im on Windows 7 x64 I'd rather use regular command prompt not PS or VBS

4 Answers 4

16

Use the following command:

dir /b /a /s
  • /b strips the date and other details from the output
  • /a only outputs the filename, no paths
  • /s enables a recursive directory listing

If you need to save the output to a file, you can use:

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

EDIT Actually the above solution doesn't reach the original question's goals. One thing I did notice from the question is that the post asks for recursive listing. which the other answer lacks so I think adding "/s" in the other answerer's answer will do the trick

for /f %a in ('dir /b /s') do @echo %~na
3
  • Could you explain this? To me it makes little sense. Nov 8, 2011 at 23:27
  • 4
    This doesn't work, /a doesn't work like that - it's a filter for which type of files you want to list. It doesn't strip the path from the filename when doing a recursive directory listing.
    – Gareth
    Nov 9, 2011 at 2:28
  • edited the answer; and just got my hands on a windows box again, I think this time should do it (win732bit)
    – Nik So
    Nov 9, 2011 at 5:27
6

Try this:

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

More information on how for works and what it's doing, type for /?

3
  • This almost works but there's a big problem.It only outputs the first word of a filename.If a filename is for example "my vacation image 1" then it only outputs "my"
    – TMRW
    Jun 8, 2011 at 4:10
  • try this: for /f "delims=|" %a in ('dir /b') do @echo %~na. By default the /f parameter of FOR will tokenize on spaces. Setting the token to a character that shouldn't appear in file/directory names will give you the entire name including spaces. Nov 8, 2011 at 22:17
  • If you want the output sent to a file, append >> filename.txt
    – Gruber
    Oct 1, 2019 at 14:26
2
for /r %i in (*) do @echo %~ni

or

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

assuming a file noquotes.bat in your %PATH% with this content

@echo %~1

for /r approach explained

for /r walks the current directory recursively (you can specify a directory for /r drive:\path\, the current directory is assumed) and executes the command specified by do for each file matched in the set (*). The set (.) would match only directories. @echo %~ni This command works as-is from the prompt. Double up on your quotes if you put it inside a batch file. i.e. for /r %%i in (*) do @echo %%~ni

forfiles approach explained

/s enumerates the current and all subdirectories
/c executes the command inside the quotes
@isdir and @fname is a symbol emitted into the command string
The extra batch file noquotes.bat helps by stripping the double-quotes with %~1 (parameter 1)
forfiles also allows you to specify a path to start at forfiles /P C:\Windows ...

5
  • @DavidPostill yes, it was a poor answer. Thanks for your comments. Please let me know if I can improve my answer further.
    – JJS
    Jul 26, 2016 at 23:46
  • @DavidPostill you have no previous answer or comment. were you moderating questions, or looking for an answer and stumble over my poor quality answer?
    – JJS
    Jul 26, 2016 at 23:51
  • Your answer popped up in the "Low Quality Posts" review queue. As I know a lot about batch files I took a close at it.
    – DavidPostill
    Jul 27, 2016 at 6:53
  • @DavidPostill thanks for your review. I welcome your review of the changes I made to my answer.
    – JJS
    Jul 27, 2016 at 14:17
  • Much better ... :)
    – DavidPostill
    Jul 27, 2016 at 14:20
-1

List all files, bare, recursively, using attributes (not directory) (files only)

dir /B /S /A:-D

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

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

1
  • The question says that the OP is “trying to get only the filenames (no extensions or file paths).  …  But when I [tried dir /b /s] to scan recursively, I also got file paths before filenames, which I do not want.” So, you are telling the OP to try a trivial variation on what they’ve already tried, and your answer demonstrates that it produces the same result as when the OP tried it (i.e., not what they want). Apr 27, 2019 at 23:24

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .