Encontre diretórios sem arquivos de música

7

Meu diretório ~/Music/ está cheio de diretórios "vazios" que desejo limpar. Digo "vazio" porque esses diretórios contêm arquivos, alguns contêm arquivos de imagem de capa antigos ou Thumbs.db files .

Eu quero excluir recursivamente todos esses diretórios que não contêm arquivos de música ou outros diretórios.

Por exemplo, ~ / Music / Audioslave / contém muitos diretórios com nomes de álbuns e nenhum arquivo de música, mas eu não quero deletá-lo, porque dentro dele estão os arquivos de música. Eu quero embora deletar ~ / Music / Audioslave / oldalbum / se o diretório oldalbum não tiver nem arquivos de música nem outros diretórios internos.

    
por volotec 01.11.2013 / 22:04

3 respostas

4

Eu encontrei este exemplo em SO, intitulado: Terminal - Excluir tudo Pastas não Conatining .mp3 Files .

#! /bin/bash

find -depth -type d | while read -r D
 do
 v=$(find "$D" -iname '*.mp3')
 case "$v" in
 ""  )
    echo "$D no mp3"
    # rm -fr "$D" #uncomment to use
 ;;
 esac
done

Exemplo

Dados da amostra.

.
|-- 1
|   |-- 1.mp3
|   '-- 1.txt
|-- 2
|   '-- 2.mp3
|-- 3
|   '-- 3.txt
|-- 4
|   '-- 4.txt
|-- 5
|   '-- 5.mp3
|-- 6
|   '-- 61
|       '-- 61.mp3
|-- 7
|   '-- 71
|       '-- 71.txt
'-- deletenomp3.bash

Execução de amostra

Se eu fosse executá-lo, ele excluiria o seguinte:

$ ./deletenomp3.bash 
./7 no mp3
./7/71 no mp3
./4 no mp3
./3 no mp3

Outros tipos de arquivos

Você pode simplesmente estender isso adicionando mais -name argumentos ao segundo comando find no script. Exemplo, para adicionar .wav arquivos:

 v=$(find "$D" -iname '*.mp3' -o -iname '*.wav');

Isso diz *.mp3 OR *.wav . Para adicionar mais ou outros:

 v=$(find "$D" -iname '*.mp3' -o -iname '*.flac' -o -iname '*.m4a');

Tenho certeza de que esse bloco poderia ser condensado se você tivesse muito mais tipos de arquivo usando alternância alternativa para find .

    
por 01.11.2013 / 22:57
6

Uma solução divertida envolve um find dentro de um find , mas de uma maneira mais segura do que a resposta aceita (eu pessoalmente não gosto de analisar a saída de um comando, sendo ls ou find , especialmente sem precauções ). O seguinte comando irá imprimir as pastas que não contêm qualquer arquivo música (aqui, o arquivo música significa uma extensão mp3 , flac , ogg , wav ou m4a , mas sinta-se à vontade para adicionar um pouco mais):

find . -depth -type d \! -exec sh -c 'find "$1" \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.ogg" -o -iname "*.wav" -o -iname "*.m4a" \) -type f | read a' _ {} \; -print

Você deve tentar isso em seu sistema, quando estiver satisfeito com o modo como ele se comporta, substitua o% final -print por -exec rm -rfv -- {} \;

A maneira como os nomes dos arquivos são usados aqui torna este método 100% seguro em relação aos nomes de arquivos com símbolos engraçados (por exemplo, espaços, citações, novas linhas, novas linhas à direita, espaços iniciais e finais, etc.).

    
por 02.11.2013 / 00:08
0

Tente algo nos moldes deste (não testado):

for dir in ~/Music/* ; do
    found=false
    # Add your music file extensions here.
    for file in "$dir"/*.{mp3,wav} */ ; do
        if ls "$file" > /dev/null 2>&1 ; then
            found=true
            break
        fi
    done

    if ! $found ; then
        # Remove 'echo' when you are ready.
        echo rm -vrf "$dir"
    fi
done

Não tenho certeza de quantos shells suportam o */ globbing. Pelo menos Bash e Zsh fazem.

    
por 01.11.2013 / 22:32

Tags