Encontre sub-pastas contendo apenas arquivos duplicados

1

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

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

    
por DDriggs00 17.11.2017 / 02:49

1 resposta

1

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 script é 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 (ou seja, os grupos que representam músicas duplicadas) e armazena essa coleção de grupos em %código%. Em seguida, ele recebe novamente o diretório pai especificado, mas lista apenas as subpastas imediatas. Ele os filtra ( $dupes ), 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, portanto, vamos analisá-lo 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 e, em seguida, para cada um deles ( ? ), garante 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 % ), indica a falha definindo If como false. Se o bloco for-each não for executado, então $allDupes permanecerá 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ê usar o Windows 7, as opções $hasAny e -File não funcionarão. Isso pode ser contornado, se necessário.

Para usar o script, salve-o como um arquivo -Directory , por exemplo %código%. Se ainda não o fez, siga as instruções na seção Habilitando Scripts do wiki de tags 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
    
por 20.11.2017 / 21:48