Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

What command do you use to find empty directories in Windows?

Some folders might contain some hidden folders like .svn or .settings, but they should still be treated as empty folders.

share|improve this question
    
What version of Windows are you running? –  Windos Aug 10 '11 at 5:41
add comment

2 Answers

up vote 4 down vote accepted

Easiest way I can think of is with a small PowerShell script. If you're running Windows 7 you should have it installed already, if not visit Microsoft.com to download and install it. The link provides a detailed description but the jist of the operation is included here for you convenience.

Open PowerShell and enter this:

(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ? {$_.GetFiles().Count -eq 0} | select FullName

Change C:\Scripts to whatever you want to search through, you can even set it to just C:\ if you want it to check the entire drive.

It will give you output like this (note these are the empty directories below C:\Scripts.

FullName
------- 
C:\Scripts\Empty 
C:\Scripts\Empty Folder 2 
C:\Scripts\Empty\Empty Subfolder 
C:\Scripts\New Folder\Empty Subfolder Three Levels Deep

If you look into PowerShell a bit I'm sure you'll be able to figure out how to automatically delete empty folders if you want to (though I recommend against it, just in case.)

Edit: As Richard mentioned in the comments, for a truly empty directory use:

(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
share|improve this answer
    
am using Windows Vista –  Joshua Aug 10 '11 at 5:56
    
PowerShell for Vista can be downloaded here: microsoft.com/download/en/details.aspx?id=23200 –  Windos Aug 10 '11 at 5:58
4  
Note: that pipeline will find folders that contain no files but do contain other folders. To have completely empty folders change third element of the pipe to ?{$_.GetFileSystemInfos().Count -eq 0}. –  Richard Aug 10 '11 at 6:14
1  
@Joshua, you didn't change "C:\Scripts" to where you want to search, hence you get the error "Cannot find path 'C:\Scripts' because it does not exist." It's right at the start of the line. –  Windos Aug 10 '11 at 9:35
1  
@Joshua, have you read Richards comment (third one in this thread) and my edit to the answer? That should only give you directories with no files and no child directories (i.e. the leaf nodes) –  Windos Aug 10 '11 at 10:40
show 6 more comments

Thanks, I used this as a basis for my script. I wanted to delete empty folders but trying to do Where-Object {$_.GetFiles().Count -eq 0} would delete folders that had sub-directories that were not empty. I ended up using a DO WHILE loop to remove a folder that had no files or folders then loop back and check again until it reached the end of the tree.

$Datefn=Get-Date -format M.d.yyyy_HH.mm.ss
#Set The File Name for the log file
$DelFileName = $Datefn
#Set The File Ext for the log file
$DelFileExt = " - Old Files" + ".log"
#Set The File Name With Ext for the log file
$DelFileName = $DelFileName + $DelFileExt
#Set Log Path
$LogPath = [Environment]::GetFolderPath("Desktop")
$Path = 'Q:\'
$NumDays = 365
Get-ChildItem -Path $Path -Exclude DCID.txt,*.exe -Recurse | Where-Object {$_.lastwritetime -lt`
(Get-Date).addDays(-$NumDays) -and $_.psiscontainer -eq $false} |
    ForEach-Object  {
        $properties = @{`
            Path = $_.Directory`
            Name = $_.Name
            DateModified = $_.LastWriteTime
            Size = $_.Length / 1GB  }
    New-Object PSObject -Property $properties | select Path,Name,DateModified, Size
    } |
    Out-File "$LogPath\$DelFileName"
<#
#Removes the files found
Get-ChildItem -Path $Path -Exclude DCID.txt,*.exe -Recurse | Where-Object {$_.lastwritetime -lt`
(Get-Date).addDays(-365) -and $_.psiscontainer -eq $false} | Remove-Item -Recurse -Force
#Removes empty folders
DO {
$a = (Get-ChildItem $Path -Recurse | Where-Object {$_.PSIsContainer -eq $true}) | Where-Object`
{$_.GetFileSystemInfos().Count -eq 0} | Select-Object Fullname
$a
(Get-ChildItem $Path -Recurse | Where-Object {$_.PSIsContainer -eq $true}) | Where-Object`
{$_.GetFileSystemInfos().Count -eq 0} | Remove-Item -Force
}
WHILE ($a -ne $null)
#>
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.