Talvez esses arquivos tenham nomes contendo espaço em branco.
Regra simples de programação shell: Sempre use aspas duplas em torno das substituições de variáveis e comandos (a menos que você saiba por que precisa deixá-las de fora). Então:
for i in *; do mv "$i" "$(echo "$i" | sed 's/.flac//g')"; done
Enquanto você está nisso, há algumas coisas que você poderia fazer melhor nesse comando, mesmo que elas não sejam a fonte do seu problema. Você deve executar o seu comando apenas nos arquivos que ele deve afetar, não em todos os arquivos no diretório atual. O sed regexp .flac
poderia corresponder a algo diferente da extensão. O comando também pode falhar se você tiver um nome de arquivo que comece com -
ou que contenha uma barra invertida (com algumas versões de echo
).
for i in *.flac.mp3; do mv -- "$i" "$(echo "$i" | sed 's/\.flac\.mp3$/\.mp3/')"; done
Mas, na verdade, você não precisa se preocupar com sed aqui, há uma construção de shell para remover um sufixo de uma string.
for i in *.flac.mp3; do mv -- "$i" "${i%.flac.mp3}.mp3"; done
--
garante que, mesmo se $i
começar com -
, não será interpretado como uma opção. Um método alternativo é garantir que $i
nunca comece com -
, por exemplo, garantindo que todos os nomes de arquivos relativos sejam prefixados com ./
(que não tem efeito no arquivo designado, pois .
é o diretório atual ).
para i em ./*.flac.mp3; do mv "$ i" "$ {i% .flac.mp3} .mp3"; feito
Existem muitas ferramentas para automatizar renomeações de arquivos; navegue renomeie aqui para algumas ideias. Por exemplo, se o seu shell é zsh:
autoload zmv # goes into your .zshrc
zmv '(*).flac.mp3' '$1.mp3'