简体   繁体   中英

Batch File to Delete Files in Folders

I have many folders in a directory that contain various files. Each filename begins with XXX_ where XXX could be the name of the folder the file is in. What I am needing to do is to go through all those folders and delete any file where XXX is the name of the folder that file is in.

Please have an eye out this question: Iterating through folders and files in batch file? .

I think this should help you.

Please let me know if you need further assistance.

EDIT #1

The joker character in DOS command line is * . Then, while searching a directory for certain files, you may consider your regular expression, that is, your XXX_ , and complete it with * , this shall return only the files for which you're looking for.

This means that instead of *.zip pattern in one of the FOR loops given the linked question, your first FOR loop should contain your directory name, then take this variable concatenated with the * character to obtain only the files you're looking for.

For example, consider trying the following:

dir /s XXX_*.*

This should return only the files you're interested in, given the right folder name.

EDIT #2

Thanks for having precised your concern.

Here is a code sample that, I do hope so, should help. Now I know you say you have the looping correct, so that perhaps only piece of this code might be needed.

@echo off

setlocal enableextensions enabledelayedexpansion

for /F "delims==" %%d in ('dir /ogne /ad /b /s .') do (
    for /F "delims==" %%f in ('dir /b "%%d\%%~nd_*.*"') do (
        echo %%d\%%f
    )
)

endlocal

This works and lists the files contained in subfolders from the current ( . ) folder.

I have tested it from the following folder:

C:\\Docume~1\\marw1\\MyDocu~1\\MyMusi~1

Where a 'XXX' folder is contained. This 'XXX' folder contains the following files:

  1. Copy of XXX_blah.bmp;
  2. XXX_blah.bmp;
  3. XXX_1234.ppt;
  4. XXX_textfile.txt.

From this structure, the output is:

C:\\Docume~1\\marw1\\MyDocu~1\\MyMusi~1\\XXX\\XXX_blah.bmp C:\\Docume~1\\marw1\\MyDocu~1\\MyMusi~1\\XXX\\XXX_1234.ppt C:\\Docume~1\\marw1\\MyDocu~1\\MyMusi~1\\XXX\\XXX_textfile.txt

I then suspect that putting a del instruction instead of an echo command shall do the trick. This means that to isolate the foldername itself from its path, you need to use the ~n instruction with your folder variable name like %%~nd , where your iterating folder variable name is %%d .

Furthermore, you could even use a parameterized batch file in the process, instead of hardcoding it, that is, if your 'set YourFolder =...' is part of your production code. This could look like:

@echo off

setlocal...

set root = %1
set root = %root:~1%
set root = %root:~0,-1%

...

endlocal

Instead of having '.' as pictured in my first FOR loop, your would replace it with "%root%" in order to consider your command line parameter instead of a hardcoded filepath.

I do help this helps, sincerely!

cd C:\"foldername"
del /s XXX_"*"
cls
exit

As Ron says, since the question is tagged "windows".

EDIT:

Ron's answer, which seems to have disappeared!, was to use del /s

EDIT2:

OK, it's valid only for file names, not for directories. For the directories you'd have to use something like sketched below.

Additional info: when you want to do the same thing recursively to files in a directory tree, and (unlike del ) there's no command that already does the traversing for you, you can use the /R option of the for command.

To see the for command's docs, do eg start "for-help" cmd /k for /? .

Cheers & hth.,

– Alf

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM