我正在寻找一种方法(不包括付费软件)来查找仅包含文件的所有文件夹,这些文件也位于父目录的至少另一个子文件夹中。如果在音乐库上使用,它将列出所有合辑专辑。
文件结构:
艺术家文件夹
-专辑文件夹
--以文件名作为标题的歌曲
您可以使用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
,则表示设置$allDupes
为false ,以指示失败。如果for-for块根本没有运行,则$hasAny
仍然是错误的。最后,大过滤器块评估相册中的所有项目是否都是重复项,并且实际上是否存在重复项。表达式的结果确定相册文件夹是否将包含在外部管道的输出中。
请注意,此脚本中使用的某些PowerShell功能是最近才引入的。如果您使用Windows 7,则-File
和-Directory
开关将不起作用。如有必要,可以解决此问题。
要使用脚本,请将其另存为.ps1
文件,例如albumdupes.ps1
。如果尚未安装,请按照PowerShell标签Wiki的“启用脚本”部分中的说明进行操作。然后,可以在保存它的目录中的PowerShell提示符下运行它,并提供指向artist文件夹的路径:
.\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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句