Implemente um comando, que é o conteúdo de uma variável.
Estou tentando criar um programa de renomeação bash que possa renomear todos os arquivos em um determinado diretório. Tenho o seguinte programa:
for PATHFILE in tracks/*
do
path="$(dirname "$PATHFILE")"
file="$(basename "$PATHFILE")"
program='mv';
if [[ "$file" =~ ([0-9]*)\s*(.*) ]]
then
from=${path}/${file}
to=${path}/${BASH_REMATCH[1]};
command_string="$program '$from' '$to'";
#here the command_string contains the command i want to execute.
$(command_string);
#causes error:
# mv: target ''\''tracks/01'\''' is not a directory.
break;
fi
done
Se eu executar o comando diretamente, ele será executado sem problemas. Eu também não entendo porque o sistema está adicionando essas vírgulas ao redor da string.
Se eu ecoar a variável na tela, posso simplesmente copiá-la, executá-la e ela será executada sem erros. mas se eu tentar executá-lo no código, continuo recebendo esse erro.
Como faço para que isso funcione?
Primeiro de tudo,
$(command_string)
daria o erro "bash: command_string: command not found" como uma substituição de comando. Uma substituição de comando executaria o comando entre parênteses e substituiria tudo pela saída desse comando.Em segundo lugar, mesmo que você tenha usado apenas
$command_string
para executar seu comando, ainda adiciona aspas simples aos nomes dos arquivos. Os nomes dos arquivos não têm aspas simples neles.Em geral, apenas evite colocar comandos em variáveis. Consulte " Como podemos executar um comando armazenado em uma variável? ".
Em vez disso, talvez algo assim:
Este loop faz (eu acho) o que você está tentando fazer. Eu comentei a parte que realmente renomeia o arquivo por segurança.