列出(然后删除)所有没有文件的文件夹

时间:2019-10-22 14:02:36

标签: cmd directory subdirectory

我想在特定路径(C:\ main_folder)下找到其中没有文件的所有文件夹。

我已经找到了使用cmd的方法:

@echo off
setlocal
set "folder=C:\main_folder"
for /r "%folder%" /d %%F in (.) do dir /b "%%F" | findstr "^" >nul || (echo %%~fF) > "C:\empty_folders_list.txt" 

但是如果我有
C:\main_folder\folder_1包含folder_2,没有文件,并且
C:\main_folder\folder_1\folder_2没有文件,该代码仅给出
C:\main_folder\folder_1\folder_2,而我也想 C:\main_folder\folder_1

它不应该只查找没有文件的文件夹,因为我可以 C:\main_folder\folder_3包含folder_4,没有文件,但如果 C:\main_folder\folder_3\folder_4包含文件,folder_3folder_4不应列出。

在拥有列表之后,我要删除它们(该列表仅用于检查/保存它们)。

我该怎么写? 谢谢!

2 个答案:

答案 0 :(得分:0)

如果您是受支持的Windows系统,它将安装PowerShell。这需要PowerShell 3.0+,但可以通过2.0进行一些修改。

这将收集子目录列表,并对降序的名称进行排序。这样可以删除具有空子目录的空目录。

当您满意要删除正确的目录时,请从-WhatIf命令中删除Remove-Item

=== Remove-Empties.ps1

$baseDir = 'C:\main_folder'
$dirs = (Get-ChildItem -Directory -Recurse -Path $baseDir).FullName | Sort-Object -Descending
foreach ($dir in $dirs) {
    if (((Get-ChildItem -Directory -Path $dir).Length -eq 0) -and
        ((Get-ChildItem -File -Path $dir | Measure-Object).Count -eq 0)) {
        "Removing directory $($dir)"
        Remove-Item -Path $dir -WhatIf
    }
}

===从cmd.exe命令行或.bat文件脚本调用

powershell -NoLogo -NoProfile -File ".\Remove-Empties.ps1" >"C:\empty_folders_list.txt"

答案 1 :(得分:0)

这对我有用:

@echo off
setlocal

set "folder=C:\temp\bob"
for /r "%folder%" /d %%F in (.) do dir /b /s /a-d "%%F" 2>nul | findstr "^" >nul || echo %%~fF

输出:

C:\temp>test
C:\temp\bob\empty parent
C:\temp\bob\empty parent\empty subfolder
C:\temp\bob\not empty parent\empty subfolder