Renomear script do shell

1

Implemente um comando, que é o conteúdo de uma variável.

Eu estou tentando criar um programa de renomeação bash que pode renomear todos os arquivos em um determinado diretório. Eu 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 consigo entender porque o sistema está adicionando as vírgulas ao redor da string.

Se eu fizer eco da variável para a tela, posso copiar, executar e executar sem erro. mas se eu tentar executá-lo no código, então eu continuo recebendo esse erro.

Como faço para que isso funcione?

    
por Hermann Ingjaldsson 19.07.2018 / 14:00

1 resposta

2

Primeiro, $(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 dentro dos parênteses e substituiria a coisa toda pela saída desse comando.

Em segundo lugar, mesmo que você tenha usado apenas $command_string para executar seu comando, você ainda adiciona aspas simples aos nomes dos arquivos. Os nomes dos arquivos não têm citações únicas.

Em geral, evite colocar comandos em variáveis. Consulte " Como podemos executar um comando armazenado em uma variável? ".

Em vez disso, talvez algo assim:

#!/bin/bash

for pathname in tracks/*; do
    if [[ "$pathname" =~ ([0-9]+)[[:blank:]]* ]]; then
        newpathname="${pathname%/*}/${BASH_REMATCH[1]}"
        printf 'Would move "%s" to "%s"\n' "$pathname" "$newpathname"
        # mv -i "$pathname" "$newpathname"
        break
    fi
done

Esse loop faz (eu acho) o que você está tentando fazer. Eu comentei o bit que realmente renomeia o arquivo para segurança.

    
por 19.07.2018 / 14:24