Vários arquivos de renomeação [duplicados]

3

Gostaria de renomear arquivos com extensão .flac.mp3 para extensão .mp3. Eu usei o seguinte comando

$ for i in *; do mv $i 'echo $i | sed 's/.flac//g''; done

Isto escreve para cada arquivo a seguinte mensagem de erro.

mv: target 'file.mp3' is not a directory

Onde estou cometendo erros?

obrigado

    
por xralf 10.04.2011 / 13:26

1 resposta

4

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 aqui para algumas ideias. Por exemplo, se o seu shell é zsh:

autoload zmv    # goes into your .zshrc
zmv '(*).flac.mp3' '$1.mp3'
    
por 10.04.2011 / 13:42