Найти подпапки, содержащие только дубликаты файлов

296
DDriggs00

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

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

1
Любое количество дубликатов? Сколько слоев в глубине? jdwolf 6 лет назад 0
Обновленный ОП @jdwolf DDriggs00 6 лет назад 0

1 ответ на вопрос

1
Ben N

Вы можете использовать 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. Если блок для каждого не работал вообще, то$hasAnyостается ложным. Наконец, большой блок фильтра оценивает, являются ли все элементы в альбоме дубликатами, и действительно ли они там есть. Результат выражения определяет, будет ли папка альбома включена в вывод внешнего конвейера.

Обратите внимание, что некоторые функции 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