Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Counting files and directories at each directory level from a batch file

I have successfully used a batch file which counts the total number of files and directories in a root directory.

Directory structure:

directory structure

Here is the current script: (gets the number of files and folders returning subfolders up to the nth child).

@echo off
set "drive=D:\Download\app"
for /d %%r in ("%drive%\*") do (
    echo Path: %%~fr
    for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s %%~fr ^| find /i "bytes"') do if "%%j"=="File(s)" (
        set numfiles=%%i
    )ELSE (
        for /f %%a in ('dir /b /s /ad %%~fr ^|find /c /v "" ') do set numfolders=%%a)
    echo Files: %numfiles%
    echo Folds: %numfolders%
)

First the program outputs the total number of files and total number of folders in the root directory and then it goes to first subfolder and outputs the same for it's whole tree, then it moves to the next folder at that level etc.

EDIT

I have done the part where it go to 1 level of subfolders and get the total number of files and folders but I want it up to N number of subfolders which mean it should output total number for each and every folder in root directory.

Here is the extended code.

@echo off
setLocal EnableDelayedExpansion 
set "drive=C:\Users\%USERNAME%\Downloads\Sandukchi"
set numfiles=
set numfolders=
set count=0;
for /d %%r in ("%drive%\*") do (
    echo %%r
    SET /A count=count + 1
    for /d %%a in ("%%r\*") do set modifiedDate=%%~ta
    for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s "%%r\*" ^| find /i "File(s)"') do set fileSizeBytes=%%k
    for %%* in ("%%r") do set folderName=%%~nx*
    for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s "%%r\*" ^| find /i "bytes"') do if "%%j"=="File(s)" (
        set numfiles=%%i
    )ELSE (
        for /f %%a in ('dir /b /s /ad "%%r\*" ^|find /c /v "" ') do set numfolders=%%a)
    echo Last Modified Date: !modifiedDate!
    echo Folder Size: !fileSizeBytes! KB
    echo Total Number of Files: !numfiles!
    echo Total Number of Folders: !numfolders!
    (
        echo !count!    %%r     !folderName!        !modifiedDate!  Total Size  !fileSizeBytes!KB   Total Files !numfiles!  Total Folder  !numfolders! 
        echo.
    )>>output.txt
)
like image 265
Ebad Ali Avatar asked Nov 24 '25 12:11

Ebad Ali


2 Answers

@ECHO Off
SETLOCAL
SET "sourcedir=."
SET "tempfile=%temp%\##__##.txt"
SET "dirname="
(
FOR /f "tokens=1,2,*delims= " %%w IN (
 'dir /s "%sourcedir%\*" '
 ) DO (
 IF "%%w"=="Directory" (
  SET "dirname=%sp256%%%y"&SET /a fcnt=0&SET /a dcnt=-2
 ) ELSE (
  FOR /f "delims= " %%p IN ("%%y") DO (
   IF "%%p"=="<DIR>" SET /a dcnt+=1
  )
 )
 IF "%%x"=="File(s)" CALL ECHO %%dirname%%*%%w*%%dcnt%%
)
)>"%tempfile%"
FOR /f "tokens=1,2,*delims=*" %%a IN ('sort "%tempfile%"') DO ECHO directory %%a&ECHO     files %%b&echo   subdirs %%c

GOTO :EOF

You would need to change the setting of sourcedir to suit your circumstances.

Generates a tempfile. No attempt made to delete the tempfile as it may contain useful data.

Run a standard dir/s command, and pick out the lines which start directory (which indicates a new directoryname) and those where the third space-delimited token is <DIR> for counting subdirectories. When the lines with second token File(s) appears, output the name, filecount and directorycount to a tempfile.

Sort the tempfile and report.

Note: %%y contains the third token onwards from each line. This is retokenised, selecting the first token only (default) to %%p isolating the third token of the original line.

The tempfile is produced using * as a separator since * is not a valid filename character.

dcnt is set to -2 to start the count-of-directories because both . and .. are reported as directorynames in a dir /s.

like image 131
Magoo Avatar answered Nov 28 '25 16:11

Magoo


Give a try for this code :

@echo off
Setlocal EnableDelayedExpansion
@For /D  %%D in (*) DO (
    Set "Folder=%%~D"
    PUSHD "!Folder!"
        FOR /F %%H in ('dir /a-d /b 2^>NUL^|find /C /V "" ') DO ( Set "numFiles=%%H" )
        FOR /F %%I in ('dir /ad  /b 2^>NUL^|find /C /V "" ') DO ( Set "numSubFolders=%%I" )
    POPD
    echo The Folder "!Folder!" has !numSubFolders! SubFolders and !numFiles! Files      
    )
)
pause & exit
like image 24
Hackoo Avatar answered Nov 28 '25 16:11

Hackoo