Localizando apenas pastas

2

Meu disco rígido está uma bagunça, então decidi fazer uma limpeza. Como parte disso, quero mesclar todas as pastas que contenham música em uma. O que eu quero fazer é procurar por qualquer * .mp3 e * .aac na minha unidade e recuperar o nome das pastas. Então, eu quero remover qualquer nome de pasta duplicada e, em uma última etapa, só pego os diretórios raiz. Eu acho difícil explicar com precisão, então aqui está uma foto de uma árvore de amostra:

root1 
|--folder1
  |--sub1
    |--file1.mp3
    |--file2.aac
  |--sub2
  |--sub3
    |--file3.mp3
    |--file4.aac
|--folder2
  | ...contains photos and documents (no mp3/aac)...
root2
|--folder3
  |--file4.mp3
  |--file5.aac
|--folder4
  |--file6.mp3

Para este exemplo, minha saída desejada é root1/folder1 root2/folder3 root2/folder4 .

Como tenho apenas conhecimento limitado de ferramentas bash e UNIX, não tenho ideia de como fazer isso. Existe uma maneira de conseguir isso? Estou bem se sua solução tiver find , mas seria muito melhor se locate fosse usado.

    
por Max Beikirch 21.03.2013 / 22:22

2 respostas

3

Entre em cada uma das pastas finais de nível superior e mova os arquivos .mp3 ou .aac abaixo da pasta para a pasta atual e, em seguida, remova as pastas agora vazias, tente:

for f in root*/folder*; do
    cd $f
    find -name "*mp3" -exec sh -c "mv {}  \$(basename {})" \;
    find -name "*aac" -exec sh -c "mv {}  \$(basename {})" \;
    find -type d -exec rmdir {} \;
    cd -
done

Você verá erros ao tentar rmdir pastas não vazias, mas as vazias serão removidas.

Se você quiser apenas saber quais pastas de nível superior contêm subpastas com arquivos mp3 ou aac:

find -name "*mp3" -o -name "*aac" | cut -d/ -f1-3 | sort -u

Encontre todos os arquivos .mp3 ou .aac, que retornam uma série de linhas como "./root2/folder3/file4.mp3". Em seguida, use cut para remover tudo, exceto as três primeiras partes do caminho "./root2/folder3". Finalmente, use sort -u para descartar quaisquer duplicatas.

    
por 21.03.2013 / 22:27
2

Localize todos os arquivos terminados em mp3 ou aac, retire o nome do arquivo com sed e imprima apenas uma ocorrência de cada pasta.

locate  --regex '.*(aac|mp3)$' | sed -e 's,/[^/]*$,,' | uniq
    
por 22.03.2013 / 23:45