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