Demian
Demian

Reputation: 390

Batch : Search Directory in every Directory and Subdirectory

I want to delete all directories with a specific name. E.g. "vendor"

D:\Data\Project1\Dir\vendor

D:\Data\Project2\AnotherDir\AnotherDir\vendor

D:\Data\Project3\vendor

This is what I have at this moment. This lists all the folders, and subfolders.

for /d %%a in (*) do dir /ad /on /s /b %%a

Now I wish to put one path in a variable, and check whether the directory is equal to a name (for example "vendor"). But I can't find how.

Can you help me?

Regards, Demian

Upvotes: 2

Views: 827

Answers (3)

dbenham
dbenham

Reputation: 130819

The DIR command has an unfortunate limitation that it cannot recursively list specific folder names. The simplest solution is to list all folders, and use FINDSTR to filter out all but the folders that match.

dir /ad /on /s /b | findstr /iec:"\vendor"

Then you simply iterate the results using FOR /F and add your RD command

for /f "eol=: delims=" %%F in
  'dir /ad /on /s /b ^| findstr /iec:"\vendor"'
) do rd /s /q "%%F" 2>nul

Upvotes: 1

Demian
Demian

Reputation: 390

This is my working solution if you have RimRaf installed:

@ECHO off

setlocal enableDelayedExpansion

:: Folders where the batch program doesn't need to search.
set skipTheseFolders=Decleir Pinokkio

:: All the folders that need to be deleted
set foldersToDelete=vendor node_modules


for /d /r %%d in (*.*) do (

    @ECHO %%d

    set folder=%%~nxd
    set canI="true"

    :: For loop to skip folders
    for %%s in (%skipTheseFolders%) do (
        :: Need to be implemented
        set canI="true"
    )

    IF !canI! =="true" (
        for %%l in (%foldersToDelete%) do (
            :: If the folder is one of the folders To Delete    
            IF "!folder!" == "%%l" (
                @echo %%d
                cd %%d
                cd ..
                :: Using Rimraf because when you delete node_modules, normal delete won't work
                start /B rimraf !folder!
            )
        )
    )
)

Upvotes: 1

Hackoo
Hackoo

Reputation: 18827

You can try this :

@Echo OFF
set "Folder=D:\Data"
set "FolderString=vendor"
Setlocal Enabledelayedexpansion
FOR /f "tokens=*" %%F IN ('dir /b /s /ad %Folder%\ ^| find "%FolderString%"') DO (set var="%%F" 
ECHO rd /s /q !var! && rd /s /q !var!) 
EndLocal
pause

Upvotes: 0

Related Questions