Questão Encontrar subpastas contendo apenas arquivos duplicados


Eu estou procurando um método (não incluindo software pago) para encontrar todas as pastas que contêm apenas arquivos com que também estão em pelo menos uma outra sub-pasta do diretório pai. Se usado em uma biblioteca de músicas, isso listaria todos os álbuns de compilação.

Estrutura do arquivo:
Pasta Artist
- Pasta do álbum
- - músicas com nome de arquivo como título


1


origem


Qualquer número de duplicatas? Quantas camadas são profundas? - jdwolf
OP @jdwolf atualizado - DDriggs00


Respostas:


Você pode usar o 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
}

Este roteiro é um pouco complicado, então vamos passar por isso com cuidado. Primeiro, ele obtém a pasta especificada como um argumento, recursivamente localiza os arquivos que contém, agrupa-os por nome de arquivo, pega apenas os grupos com mais de um item (isto é, os grupos que representam músicas duplicadas) e armazena essa coleção de grupos em $dupes. Em seguida, ele recebe novamente o diretório pai especificado, mas lista apenas as subpastas imediatas. Filtra-os (?), permitindo que apenas aqueles contendo apenas entradas duplicadas saiam do pipeline e sejam impressos na tela.

Esse grande bloco de filtro ocupa a maior parte do script, então vamos dar uma olhada em mais detalhes. Ele começa com duas variáveis, uma para acompanhar se a pasta do álbum atual contém apenas duplicatas até o momento e outra para observar se realmente existem músicas na pasta. (Eu suspeito que não seria realmente útil contar pastas vazias como álbuns de compilação.) Ele lista os arquivos na pasta do álbum, então para cada um deles (%), certifica-se de que existe um grupo duplicado contendo um arquivo com o mesmo nome, e se não (ou seja, nada sai do pipeline curto dentro do If), indica a falha, definindo $allDupes para falso. Se o bloco for-each não for executado, então $hasAny permanece falso. Finalmente, o grande bloco de filtro avalia se todos os itens do álbum são duplicados e se há algum item ali. O resultado da expressão determina se a pasta do álbum será incluída na saída do pipeline externo.

Observe que alguns dos recursos do PowerShell usados ​​neste script foram introduzidos moderadamente recentemente. Se você usa o Windows 7, o -File e -Directory os comutadores não funcionarão. Isso pode ser contornado, se necessário.

Para usar o script, salve-o como um .ps1 arquivo, por exemplo albumdupes.ps1. Se você ainda não o fez, siga as instruções na seção Habilitando Scripts do o wiki da tag do PowerShell. Em seguida, você pode executá-lo a partir de um prompt do PowerShell no diretório em que você salvou, fornecendo o caminho para a pasta do artista:

.\albumdupes.ps1 'C:\Users\Ben\Test\albumtest'

Você terá uma saída assim:

    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

1