我正在寻找一种方法(不包括付费软件)来查找所有仅包含文件且这些文件也位于父目录的至少一个其他子文件夹中的文件夹。如果用于音乐库,这将列出所有合辑专辑。
文件结构:
艺术家文件夹
- 专辑文件夹
- - 以文件名为标题的歌曲
答案1
您可以使用 PowerShell!
$dupes = gi $args[0] | gci -File -Recurse | group Name | ? {$_.Count -gt 1}
gi $args[0] | gci -Directory | ? {
$allDupes = $true
$hasAny = $false
$_ | gci -File | % {
$folder = $_
$hasAny = $true
If (!($dupes | ? {$_.Name -eq $folder.Name})) {$allDupes = $false}
}
$allDupes -and $hasAny
}
这个脚本有点棘手,所以我们来仔细看看。首先,它获取作为参数指定的文件夹,递归查找其中包含的文件,按文件名对它们进行分组,只取包含多个项目的组(即代表重复歌曲的组),并将该组集合存储在中$dupes
。然后它再次获取指定的父目录,但仅列出直接子文件夹。它过滤它们(?
),只让那些仅包含重复条目的条目退出管道并打印到屏幕上。
那个大过滤器块占据了大部分脚本,所以让我们更详细地看一下。它从两个变量开始,一个用于跟踪当前专辑文件夹到目前为止是否只包含重复项,另一个用于注意文件夹中是否真的有任何歌曲。(我怀疑将空文件夹算作合辑专辑其实没什么用。)它列出了专辑文件夹中的文件,然后针对每个文件(%
) 确保存在一个包含同名文件的重复组,如果没有(即 内部的短管道没有任何输出If
),则通过设置为 false 来指示失败$allDupes
。如果 for-each 块根本没有运行,则$hasAny
保持为 false。最后,大过滤器块评估相册中的所有项目是否都是重复的,并且确实存在任何重复项。表达式的结果决定相册文件夹是否将包含在外部管道的输出中。
请注意,此脚本中使用的某些 PowerShell 功能是最近才引入的。如果您使用 Windows 7,-File
和-Directory
开关将不起作用。如有必要,可以解决这个问题。
要使用脚本,请将其保存为.ps1
文件,例如albumdupes.ps1
。如果您还没有这样做,请按照启用脚本部分中的说明进行操作PowerShell 标签 wiki。然后您可以从保存它的目录中的 PowerShell 提示符运行它,并提供艺术家文件夹的路径:
.\albumdupes.ps1 'C:\Users\Ben\Test\albumtest'
您将获得如下输出:
Directory: C:\Users\Ben\Test\albumtest
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 11/20/2017 2:00 PM Album C
d----- 11/20/2017 2:01 PM Album F