Delete all files from a folder and its sub folders

57

16

I want to remove all files from a folder structure, so I'm left with an empty folder structure.

Can this be achieved in either batch or VBScript scripting?

I have tried a very basic batch command, but this required the user to allow the deletion of each file. This wasn't a suitable solution as there are many hundreds of files and this will increase massively over time.

What can you suggest?

BobJim

Posted 2014-04-15T12:40:31.173

Reputation: 980

I'll second @BigHomie's recommendation - I just learned some PowerShell and I'd have to say it's pretty neat - not too hard, a good weapon in any coder's arsenal. I use it fairly frequently now. – Ben – 2014-12-19T17:13:44.800

If you want to delete recursively based on the extension: ls -Recurse *.docx | rm. – Kolob Canyon – 2016-10-12T20:34:58.910

You mean a recurssive delete? This can indeed be done. Something like rd /s /q "c:\folder a will perform a recursive delete on all files and folders within Folder A – Ramhound – 2014-04-15T12:47:43.990

I could do, I dont know how to script in powershell but have previous run powershell scripts. – BobJim – 2014-04-15T13:41:42.227

2Now is a perfect time to learn, I would research batch and vbs syntax for legacy purposes, but invest more time in learning PS. – MDMoore313 – 2014-04-15T14:26:27.560

I havent had the chance to check the code yet although I'm sure it will work. I will come back and select the most appropiate answer to my initial query. – BobJim – 2014-04-17T07:08:06.123

Answers

81

This can be accomplished using PowerShell:

Get-ChildItem -Path C:\Temp -Include *.* -File -Recurse | foreach { $_.Delete()}

This command gets each child item in $path, executes the delete method on each one, and is quite fast. The folder structure is left intact.

If you may have files without an extension, use

Get-ChildItem -Path C:\Temp -Include * -File -Recurse | foreach { $_.Delete()}

instead.

It appears the -File parameter may have been added after PowerShell v2. If that's the case, then

Get-ChildItem -Path C:\Temp -Include *.* -Recurse | foreach { $_.Delete()}

It should do the trick for files that have an extension.

If it does not work, check if you have an up-to-date version of Powershell

MDMoore313

Posted 2014-04-15T12:40:31.173

Reputation: 4 874

@ThomasWeller lol it happens sometimes what version of powershell do you have? – MDMoore313 – 2016-10-06T18:45:10.167

@ThomasWeller Powershell is awesome, why not just upgrade powershell? If you're running an out of the box version of windows 7 that isn't fully patched yet you can't blame M$ I mean it is what it is. – MDMoore313 – 2016-10-06T18:50:29.587

2

Can't they implement powershell --version? Can't they use a version number with positive digits? It's just crazy. More than 1300 upvotes for a question on how to find out a version number of a program?

– Thomas Weller – 2016-10-06T18:53:27.050

can I ask, why | foreach { $_.Delete()} you could easily replace that expression with rm and it would be much easier to understand – Kolob Canyon – 2016-10-12T20:41:17.423

@KolobCanyon I suppose you could do that, however it being much easier to understand is subjective. Not only that, but you get to see what powershell is doing when you actually type rm, it calls the delete method on each object. – MDMoore313 – 2017-03-15T16:43:23.023

This does not delete subfolders in my case (also tried changing foreach { $_.Delete()} for rm) – demonicdaron – 2018-11-28T13:56:41.453

1@demonicdaron its not supposed to; The OP's question was for preserving the folder structure. – MDMoore313 – 2018-11-29T04:34:23.253

@MDMoore313 sorry, should have read the OP better – demonicdaron – 2018-11-29T08:25:02.687

This doesn't support folders - the next answer does work though – A br – 2019-12-22T23:50:00.430

@Abr it's not supposed to delete folders, it's supposed to answer the OP's question. – MDMoore313 – 2019-12-23T01:12:25.303

1It's -Include *.* not -Include ., big difference! :-) – MDMoore313 – 2014-04-25T11:00:59.437

Get-ChildItem -Path D:\EmptyThisFolder -Include . -File -Recurse | foreach { $_.Delete()} – BobJim – 2014-04-25T13:07:18.570

Why are you using -Include . ?? That's what the problem is. – MDMoore313 – 2014-04-25T13:08:32.513

29

Short and suite PowerShell. Not sure what the lowest version of PS it will work with.

Remove-Item c:\Tmp\* -Recurse -Force

Evan Nadeau

Posted 2014-04-15T12:40:31.173

Reputation: 391

2Nice and easy. This did the trick whilst the accepted answer did not! – demonicdaron – 2018-11-28T13:58:08.027

This should be the accepted answer, you can even just type rm * since it's not really advisable to force (the confirmation dialog has a "Yes to All" option anyway). – J Garcia – 2019-10-30T04:49:54.430

@JGarcia the OP said they didn't want user input at all, so -Force is needed in this case. – Nick Coad – 2020-01-01T22:28:05.070

22

You can do so with del command:

dir C:\folder
del /S *

The /S switch is to delete only files recursively.

phoops

Posted 2014-04-15T12:40:31.173

Reputation: 2 977

2And you can use /Q to NOT ask for confirmation when using wildcards. – Aylatan – 2015-09-25T00:41:08.613

Another example.. say you want to remove .mov (video) files from your folders that contain images as well... then you would do this: del *.mov /S (from the root of the structure of course) – Malachi – 2016-09-23T14:38:53.340

The title reads "Delete all files from a folder and its sub folders" so this is not a solution. – Anders Lindén – 2017-08-22T06:25:24.250

2Will this only delete files but leave the folders? – BobJim – 2014-04-15T12:56:21.133

5Yes. You can add /P option so it will ask you to confirm every delete just to check that. – phoops – 2014-04-15T12:59:53.017

thanks ill give it a go! hopefully will save loads of time! – BobJim – 2014-04-15T13:11:31.123

FYI - this will only delete files you have access to. This will not delete hidden or system files. – Keltari – 2014-04-15T13:33:02.727

3Yes. And for deleting hidden and system files, do attrib -s -r -h Folder\*.* /s /d before deleting. And for permissions use takeown command. – Jet – 2014-04-25T13:49:13.207

4

Reading between the lines on your original question I can offer an alternative BATCH code line you can use. What this will do when ran is only delete files that are over 60 days old. This way you can put this in a scheduled task and when it runs it deletes the excess files that you don't need rather than blowing away the whole directory. You can change 60 to 5 days or even 1 day if you wanted to. This does not delete folders.

forfiles -p "c:\path\to\files" -d -60 -c "cmd /c del /f /q @path"

Travis

Posted 2014-04-15T12:40:31.173

Reputation: 1 044

The title reads "Delete all files from a folder and its sub folders" so this is not a solution. – Anders Lindén – 2017-08-22T06:26:15.373

Thanks for the idea but currently I think the "emptying" process will be completed on a very unscheduled adhoc time frame. I'll keep that code for the future though! Cheers – BobJim – 2014-04-15T13:42:30.233

4

Using PowerShell:

Get-ChildItem -Path c:\temp -Include * | remove-Item -recurse 

Gregory Suvalian

Posted 2014-04-15T12:40:31.173

Reputation: 161

3

Use PowerShell to Delete a Single File or Folder. Before executing the Delete command in powershell we need to make sure you are logged in to the server or PC with an account that has full access to the objects you want to delete.

With Example: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/

Using PowerShell commnads to delete a file

Remove-Item -Path "C:\dotnet-helpers\DummyfiletoDelete.txt"

The above command will execute and delete the “DummyfiletoDelete.txt” file which present inside the “C:\dotnet-helpers” location.

Using PowerShell commnads to delete all files

Remove-Item -Path "C:\dotnet-helpers*.*"

Using PowerShell commnads to delete all files and folders

Remove-Item -Path "C:\dotnet-helpers*.*" -recurse

-recurse drills down and finds lots more files. The –recurse parameter will allow PowerShell to remove any child items without asking for permission. Additionally, the –force parameter can be added to delete hidden or read-only files.

Using -Force command to delete files forcefully

Using PowerShell command to delete all files forcefully

Remove-Item -Path "C:\dotnet-helpers*.*" -Force

thiyagu selvaraj

Posted 2014-04-15T12:40:31.173

Reputation: 31

1

This is the easiest way IMO

Open PowerShell, navigate to the directory (cd), THEN

ls -Recurse * | rm

(Poof) everything is gone...

If you want to delete based on a specific extension

ls -Recurse *.docx | rm

ls is listing the directory

-Recurse is a flag telling powershell to go into any sub directories

* says everything

*.doc everything with .doc extension

| feed the output from the left to the right

rm delete

All the other answers appear to make this more confusing than necessary.

Kolob Canyon

Posted 2014-04-15T12:40:31.173

Reputation: 307

1

Try this using PowerShell. In this example I want to delete all the .class files:

Get-ChildItem '.\FOLDERNAME' -include *.class -recurse | foreach ($_) {remove-item $_.FullName}

Boubakr

Posted 2014-04-15T12:40:31.173

Reputation: 111

1

  1. In Windows Explorer select the root dir containing all the files and folders.

  2. Search for *

  3. Sort by Type (All the folders will be at the top and all the files listed underneath)

  4. Select all the files and press Delete.

This will delete all the files and preserve the directory structure.

Emel

Posted 2014-04-15T12:40:31.173

Reputation: 11

1

Delete all files from current directory and sub-directories but leaving the folders structure.

(/Q) switch is for asking the user if he is ok to delete

Caution : try it without the /Q to make sure you are not deleting anything precious.

del /S * /Q 

hdoghmen

Posted 2014-04-15T12:40:31.173

Reputation: 113

0

dir C:\testx\ -Recurse -File | rd -WhatIf
What if: Performing the operation "Remove File" on target "C:\testx\x.txt".
What if: Performing the operation "Remove File" on target "C:\testx\bla\x.txt".

user646044

Posted 2014-04-15T12:40:31.173

Reputation:

0

With Powershell 5.1:


$extensions_list = Get-ChildItem -Path 'C:\folder_path\' -Recurse

foreach ( $extension in $extensions_list) {

    if ($extension.Attributes -notlike "Directory") {

        Remove-Item $extension.FullName  
    }
}

It's removes all itens that are not Directory.

$extension.FullName = Item Path

$extension.Attributes = Item Type ( Directory or Archive )

Maycon Paixão

Posted 2014-04-15T12:40:31.173

Reputation: 1

0

We can delete all the files in the folders and its sub folder via using the below command.

Get-ChildItem -Recurse -Path 'D:\Powershell Practice' |Where-Object{$_.GetType() -eq [System.IO.FileInfo]} |Remove-Item

Dishant Batra

Posted 2014-04-15T12:40:31.173

Reputation: 1

-1

As a complement to the above answers, actually there's no need to use the Get-Childitem and pass the result to the pipeline in the above answers, because the -Include keyword is included in the Remove-Item command

One can simply:

Remove-Item -Include "." "C:\Temp" -Recurse

Sams0nT

Posted 2014-04-15T12:40:31.173

Reputation: 1