Вы можете использовать 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-each не запускается вообще, то $hasAny
остается false. Наконец, большой блок фильтра оценивает, являются ли все элементы в альбоме дубликатами, и действительно ли они там есть. Результат выражения определяет, будет ли папка альбома включена в вывод внешнего конвейера.
Обратите внимание, что некоторые функции PowerShell, используемые в этом сценарии, были представлены в последнее время в умеренной степени. Если вы используете Windows 7, ключи -File
и -Directory
работать не будут. Это можно обойти в случае необходимости.
Чтобы использовать скрипт, сохраните его как файл .ps1
, например albumdupes.ps1
. Если вы этого еще не сделали, следуйте инструкциям в разделе «Включение сценариев» вики-тега PowerShell . Затем вы можете запустить его из командной строки 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