No zsh (que você pode usar no Cygwin ou Linux), você pode usar os qualificadores
for d in /path/to/music/**/*(/); do
rm -f $d/*.jpg(oL[1,-2]N)
mv $d/*.jpg $d/cover.jpg
done
O loop percorre todos os subdiretórios de /path/to/music recursivamente. O sufixo (/) restringe as correspondências aos diretórios. O argumento para rm -f usa três qualificadores de glob: oL para classificar por tamanho; [1,-2] para reter apenas as correspondências até a penúltima ( PATTERN([-1]) é a última correspondência, PATTERN([-2]) é a penúltima reunião e PATTERN([1,-2]) é a lista de correspondências da primeira ao penúltimo inclusive); e N para produzir uma lista vazia em vez de deixar o padrão não expandido ou relatar um erro se o padrão não corresponder a nenhum arquivo.
Você pode receber um erro inofensivo se o arquivo restante já for chamado de cover.jpg ou se não houver nenhum arquivo .jpg em um diretório. Para evitá-los, altere a chamada mv para
[[ -e $d/cover.jpg ]] || mv $d/*.jpg $d/cover.jpg
Aqui está um método alternativo que renomeia primeiro e exclui. Ele usa a sintaxe PATTERN1~PATTERN2 , que requer a opção extended_glob , para selecionar arquivos que correspondam a PATTERN1 , mas não PATTERN2 . ((#jpgs)) testa se a matriz jpgs contém pelo menos um elemento.
setopt extended_glob
for d in /path/to/music/**/*(/); do
jpgs=($d/*.jpg(oL))
((#jpgs)) || continue
[[ $jpgs[1] == */cover.jpg ]] || mv $jpgs[1] $d/cover.jpg
rm -f $jpgs[2,-1]
done