Simples, isso transparece. O seguinte obtém uma lista de diretórios com a capa e compara isso com uma lista de todos os diretórios de segundo nível. Linhas que aparecem em ambos os "arquivos" são suprimidas, deixando uma lista de diretórios que precisam de capas.
comm -3 \
<(find ~/Music/ -iname 'cover.*' -printf '%h\n' | sort -u) \
<(find ~/Music/ -maxdepth 2 -mindepth 2 -type d | sort) \
| sed 's/^.*Music\///'
Hooray.
Notas:
-
Os argumentos de
commsão os seguintes:-
-1suprime linhas exclusivas do arquivo1 -
-2suprime linhas exclusivas do arquivo2 -
-3suprime as linhas que aparecem nos dois arquivos
-
-
commsó recebe arquivos, por isso o método de entrada<(...)kooky. Isso canaliza o conteúdo por meio de um arquivo real [temporário]. -
commprecisa de entrada classificada ou não funciona efindnão garante de forma alguma um pedido. Também precisa ser único. A primeira operaçãofindpode encontrar vários arquivos paracover.*, para que possa haver entradas duplicadas.sort -urapidamente faz com que eles caiam em um. A segunda descoberta sempre será única. -
dirnameé uma ferramenta útil para obter o diretório de um arquivo sem recorrer ased(et al). -
findecommestão um pouco confusos com sua saída. Osedfinal está lá para limpar as coisas, então você fica comArtist/Album. Isso pode ou não ser desejável para você.