Como apagar pastas em lote com apenas um arquivo?

1

Então, aparentemente, tenho centenas de "álbuns" na minha pasta de músicas com apenas um arquivo de música.

Eu não gosto disso, quero apenas álbuns completos nessa pasta.

Existe uma solução fácil para isso? Em essência, uma ferramenta que exclui todas as pastas com apenas um arquivo nele? Estou usando o Windows 7

    
por Forza 20.05.2013 / 20:27

2 respostas

1

Abra o PowerShell ISE e tente executar isso:

$targets = @()
$folders = dir "D:\Users\Forza\Music\" | Where {$_.mode -match "d"}
foreach ($folder in $folders) {
     if(
        ($folder.GetFiles() |
         Measure-Object |
         Select -ExpandProperty Count) -eq 1) 
        {$targets += $folder}
}
$targets | Format-Table -Property Name

Isso (deve) chutar uma lista de todas as pastas com um único arquivo nelas. Dê uma boa olhada na lista e certifique-se de que não há pastas não intencionais. Em seguida, você pode executar o comando:

foreach ($target in $targets){Remove-Item -Recurse -Force $target.FullName}

Isso excluirá todas as pastas listadas em $targets .

Se você precisar modificar esse script, será útil entender o que está fazendo. Por exemplo, como está, você estaria excluindo todas as pastas com subpastas, mas sem arquivos no primeiro diretório . Portanto, se você tiver algo como C:\Users\Forza\Music\SomeArtist\SomeAlbum , todo o diretório SomeArtist será excluído. Além disso, todas as pastas vazias permanecerão.

Vamos linha por linha:

  1. $targets = @() define uma matriz. Isso é para que possamos adicionar $folder s a $targets sem gerar um erro e garantir que $targets comece vazio, em vez de adicioná-lo continuamente enquanto modifica nosso script e, eventualmente, excluir mais pastas do que pretendíamos. / li>
  2. $folders = dir 'C:\Users\Forza\Music\' | Where {$_.mode -match "d"} lista o conteúdo do diretório e dos pipes especificados que saem para o comando Where-Object . $_.mode -match "d" pega os objetos encanados e verifica se eles são diretórios.
  3. foreach ($folder in $folders) { começa a passar por cada pasta
  4. if( inicia uma instrução if para verificar a contagem de arquivos dentro da pasta. Eu dividi cada linha para torná-la confusa legível.
  5. $folder.GetFiles() | esta pega todos os arquivos na pasta que estamos verificando. Observe o pipe, que envia a saída para o próximo comando na próxima linha.
  6. Measure-Object | é bastante auto-explicativo. Caso contrário, tente o comando Get-Help Measure-Object .
  7. Select -ExpandProperty Count) -eq 1) seleciona e expande a propriedade Count para que possamos ver se é igual a ( -eq ) 1. Observe os dois parênteses de fechamento, um para fechar ($folder.GetFiles() | Measure-Object | Select -ExpandProperty Count) e um para fechar a instrução if .
  8. {$targets += $folder} adiciona nossa pasta de correspondência de critérios à nossa lista $targets .
  9. } fecha o loop foreach.
  10. $targets | Format-Table -Property Name mostra a lista de pastas para exclusão.

Se você quiser modificar isso para excluir pastas vazias, basta alterar -eq 1 para -lt 2 . Com um pouco de criatividade, você deve ser capaz de fazer o script manipular sua estrutura de arquivos confusa, da maneira que achar melhor.

Para cuidar de uma pasta de Artistas em \ Música, altere o caminho para algo como C:\Users\Forza\Music\*\*\ .

    
por 20.05.2013 / 21:22
1

Isso fez isso por mim:

ls I:\temp | ?{$_.PSIsContainer} | ?{(ls $_.FullName | ?{-NOT $_.PSIsContainer}).Count -eq 1} | %{Remove-Item $_.FullName -WhatIf}

Remova o -WhatIf para fazer isso de verdade. Observe que ele removerá uma pasta que tenha um arquivo, mesmo que tenha subpastas com mais arquivos.

    
por 20.05.2013 / 21:45