1

Я ищу способ (не включая платное программное обеспечение) для поиска всех папок, которые содержат только файлы, которые также находятся по крайней мере в одной другой подпапке родительского каталога. При использовании в музыкальной библиотеке, это будет список всех альбомов компиляции.

Структура файла:
Папка художника
- Папка альбома
- - песни с именем файла в качестве заголовка

1 ответ1

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), указывает на ошибку, установив для $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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .