$$
expande para o ID do processo do shell em todos os shells compatíveis com POSIX.
A alteração de *.mp3$$
arquivos para *.mp3
pode ser feita assim:
for i in *.mp3\$\$; do mv -i "$i" "${i%%\$\$}"; done
Sua segunda linha de comando foi aparentemente executada por um shell com um PID de 582, então foi expandida para:
for i in *mp3582; do mv "$i" "mp3"; done
Então, como nada provavelmente corresponderia à expressão curinga, o loop seria executado apenas uma vez com a expressão curinga colocada como está na variável $i
:
mv "*mp3582" "mp3"
mv: rename *mp3582 to mp3: No such file or directory
Sua segunda tentativa também renomeia cada arquivo para o nome de arquivo fixo "mp3", sobrescrevendo qualquer arquivo anterior com esse nome, se "mp3" não for um diretório que já existe. Isso pode explicar por que todos os arquivos, exceto um, foram excluídos, se você também tentou usá-lo no formulário de escape:
for i in *mp3\$\$; do mv "$i" "mp3"; done
Isso faria:
mv <filename1>.mp3$$ mp3
mv <filename2>.mp3$$ mp3 # overwrites the previous "mp3"
mv <filename3>.mp3$$ mp3 # overwrites the previous "mp3" again
...
Sua tentativa original é realmente solucionável:
for f in *; do a="(echo $f | sed s/mp3$$/mp3/)"; mv "$f" "$a"; done # your version
for f in *; do a="$(echo \"$f\" | sed s/mp3\$\$/mp3/)"; mv "$f" "$a"; done # fixed version
Um comando ou pipeline dentro de apenas parênteses não será executado: você precisará da construção $( ... )
para isso. Adicione aspas duplas em torno dele para manipular a saída que pode conter espaço em branco, ponto-e-vírgula ou outros caracteres complicados.
Em seguida, os caracteres $ dentro do $( ... )
passarão pelo interpretador duas vezes : uma vez quando toda a linha de comando for analisada, outra vez quando a construção $( ... )
for analisada para execução. Em cada passagem, os caracteres com escape de contrabarra obtêm a barra invertida removida. Então, você precisará de barras invertidas duplas para preservar o "mp3 $$" do sed.
Além disso, $ f precisa de aspas duplas, caso os nomes dos arquivos contenham espaços em branco ou outros caracteres complicados ... e as aspas duplas precisam ser escapadas, pois estão dentro de outro conjunto de aspas duplas e queremos preservá-las para o $( ... )
pass.