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
comm
são os seguintes:-
-1
suprime linhas exclusivas do arquivo1 -
-2
suprime linhas exclusivas do arquivo2 -
-3
suprime as linhas que aparecem nos dois arquivos
-
-
comm
só recebe arquivos, por isso o método de entrada<(...)
kooky. Isso canaliza o conteúdo por meio de um arquivo real [temporário]. -
comm
precisa de entrada classificada ou não funciona efind
não garante de forma alguma um pedido. Também precisa ser único. A primeira operaçãofind
pode encontrar vários arquivos paracover.*
, para que possa haver entradas duplicadas.sort -u
rapidamente 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). -
find
ecomm
estão um pouco confusos com sua saída. Osed
final está lá para limpar as coisas, então você fica comArtist/Album
. Isso pode ou não ser desejável para você.