【问题标题】:List (and then delete) all folders with no files列出(然后删除)所有没有文件的文件夹
【发布时间】:2020-02-18 17:02:40
【问题描述】:

我想查找特定路径 (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 不应列出。

得到列表后我想删除它们(列表仅用于检查/保存它们)。

我该怎么写? 谢谢!

【问题讨论】:

  • 你应该试试dir /b /s /a-d "%%F",看看效果如何。
  • 谢谢。试过这个@echo off setlocal set "folder=C:\main_folder" for /r "%folder%" /d %%F in (.) do dir /b /s /a-d "%%F" | findstr "^" >nul || (echo %%~fF) > "C:\empty_folders_list.txt" 但它只写 C:\main_folder\folder_1\folder_2...

标签: cmd directory subdirectory


【解决方案1】:

这对我有用:

@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

【讨论】:

  • 没错,它运行良好。我的问题是 (echo %%~fF) > "C:\empty_folders_list.txt" 用于写入文件,因为里面只有最后一个文件夹......我如何将它们全部放在那个文件中?以及如何删除它们呢?谢谢!
  • 使用>> 而不是>。追加而不是覆盖。
【解决方案2】:

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

这会收集子目录列表并对名称进行降序排序。这是为了删除具有空子目录的空目录。

如果您对删除正确的目录感到满意,请从 Remove-Item 命令中删除 -WhatIf

=== 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"

【讨论】:

  • 谢谢。有了它,我得到了“删除目录 C:\main_folder\folder_1\folder_2 如果:对目标“C:\main_folder\folder_1\folder_2”执行“删除目录”操作。”但这并不是说 C:\main_folder\folder_1 也是空的......在 $baseDir 我必须写我的主路径?或者我应该添加 '/src/t' 吗?
  • 我假设您将第一行更改为 $baseDir = 'C:\main_folder'。它没有删除folder1 的原因是因为-WhatIf 而实际上并没有删除folder2folder 仍然包含folder2,所以它不会被删除。
  • 当你删除-WhatIf时,我希望它会显示folder1被删除。
猜你喜欢
  • 2014-01-19
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多