Search code examples
batch-filesubdirectory

Batch script to get a list of all files in multiple subdirectories


I'd like to create a batch script that will create a list of all files in a directory.

So far here's what I have:

@echo off

dir c:\users\documents\* /b > filelist.txt

This works perfectly with one small hitch. The files I want to get for the list are nestled in multiple user directories which are nestled inside two directories (A-L / M-Z). I can get around the two alphabetical directories easily by just writing two lines for this. However, I'm not sure how to get a list of the files inside of the sub-directories.

BONUS: This is an extra bit that I haven't actually researched yet but thought I'd throw it in there. I'm going to try and get this script to attach the "filelist.txt" to an email and send it out automatically.

EDIT: Forgot a much more important bonus problem.

Here's a really pitiful illustration of the file structure.

enter image description here

I'd like to be able to have a list that shows the parent directory to the files so that it would show up something like this in the filelist.txt: "A Name\File1.ext"

EDIT: Using dir /b/s seems to list all subdirectories, files and gives the full path length. Is there any way to only return a list when there is something in a particular one of the "Name directories"? So if everything but "D Name" is empty, it will only return

\D Name\file1.ext
\D Name\file2.ext

Solution

  • dir has no code to remove a part of it's output. Therefore you have to parse its output with a for loop that does the removal:

    @echo off
    setlocal enabledelayedexpansion
    pushd "c:\users\documents\"
    (
      for /r %%a in (*) do (
        set x=%%a
        echo !x:%cd%=!
      )
    )>filelist.txt
    popd
    

    for sending automatic mails, see our search function, which is well hidden at the top right corner of this site (please don't tell anyone or we will get much less duplicates ;)).

    EDIT for I don't suppose there's anyway I can limit how far down in subdirectories this works?
    where there is a will, there is a way...

    @echo off
    setlocal enabledelayedexpansion
    set /p lv="max Levels deep [0...n]= "
    set /a lv+=2
    pushd "c:\users\theo\"
    (
      for /r %%a in (*.bat) do (
        set x=%%a
        set x=!x:%cd%=!
        for /f "tokens=1,%lv% delims=\" %%b in ("!x!") do if "%%c"=="" echo !x!
      )
    )>filelist.txt
    popd
    

    An input of "0" means "in this folder only, no subfolders"; "2" means "in this folder and its subfolders, max. depth = 2"

    The inner for checks, if token "%lv%+2" (therefore set /a lv+=2) is empty. If yes, the depth is less or equal %lv% and the string is shown. If it is not empty, the depth is greater than %lv% - no echo.