如何批量删除只有一个文件的文件夹?

如何批量删除只有一个文件的文件夹?

所以我的音乐文件夹中显然有数百张“专辑”,但其中只有一个音乐文件。

我不喜欢这样,我只想要该文件夹中的完整专辑。

有没有简单的解决方案?本质上是一个删除所有只有一个文件的文件夹的工具?我使用的是 Windows 7

答案1

打开 PowerShell ISE 并尝试运行以下命令:

$targets = @()
$folders = dir "D:\Users\Forza\Music\" | Where {$_.mode -match "d"}
foreach ($folder in $folders) {
     if(
        ($folder.GetFiles() |
         Measure-Object |
         Select -ExpandProperty Count) -eq 1) 
        {$targets += $folder}
}
$targets | Format-Table -Property Name

这(应该)会列出所有包含单个文件的文件夹列表。仔细查看列表并确保没有意外的文件夹。然后你可以运行命令:

foreach ($target in $targets){Remove-Item -Recurse -Force $target.FullName}

这将删除 中列出的所有文件夹$targets

如果需要修改此脚本,了解其作用会有所帮助。例如,您将按原样删除第一个目录中所有带有子文件夹但没有文件的文件夹。因此,如果您有类似 的内容C:\Users\Forza\Music\SomeArtist\SomeAlbum,则整个目录SomeArtist将被删除。此外,所有空文件夹都将保留。

让我们逐行看一下:

  1. $targets = @()定义一个数组。这样我们就可以添加$folders 而$targets不会引发错误,并确保它$targets从空开始,而不是在修改脚本时不断添加内容,最终删除比我们预期多得多的文件夹。
  2. $folders = dir 'C:\Users\Forza\Music\' | Where {$_.mode -match "d"}列出指定目录的内容并将输出通过管道传输到Where-Object命令。$_.mode -match "d"获取管道对象并检查它们是否是目录。
  3. foreach ($folder in $folders) {开始循环遍历每个文件夹
  4. if(开始一个 if 语句来检查文件夹内的文件数量。我将每一行拆分开来,使其更易于阅读。
  5. $folder.GetFiles() |这将抓取我们正在检查的文件夹中的所有文件。请注意管道,它将输出发送到下一行的下一个命令。
  6. Measure-Object |非常容易理解。如果没有,请尝试命令Get-Help Measure-Object
  7. Select -ExpandProperty Count) -eq 1)选择并扩展Count属性,以便我们可以查看它是否等于(-eq)1.注意两个右括号,一个用于结束($folder.GetFiles() | Measure-Object | Select -ExpandProperty Count),一个用于结束if语句。
  8. {$targets += $folder}将符合条件的文件夹添加到我们的$targets列表中。
  9. }关闭 foreach 循环。
  10. $targets | Format-Table -Property Name踢出要删除的文件夹列表。

如果您想要修改它以删除空文件夹,只需更改-eq 1-lt 2。只要发挥一点创造力,您就应该能够让脚本以您认为合适的方式处理混乱的文件结构。


要处理 \Music 下的 Artists 文件夹,请将路径更改为类似C:\Users\Forza\Music\*\*\

答案2

这对我来说是这样的:

ls I:\temp | ?{$_.PSIsContainer} | ?{(ls $_.FullName | ?{-NOT $_.PSIsContainer}).Count -eq 1} | %{Remove-Item $_.FullName -WhatIf}

删除 -WhatIf 即可真正实现。请注意,即使文件夹中有包含更多文件的子文件夹,它也会删除其中包含一个文件的文件夹。

相关内容