Eu tenho um DE_CopyOldToNew.txt
arquivo com vários comandos de cópia para copiar nomes de arquivos antigos para novos nomes de arquivos.
O arquivo contém linhas como:
cp /migrationfiles/Company\ Name\ GmbH/2014.138_Old\ File\ Name.pdf /appl/data/docs/202403/DE_2014.138_NewFile_1.pdf
cp /migrationfiles/Company\ Name\ GmbH/2014.139_Old\ File\ Name.pdf /appl/data/docs/202403/DE_2014.139_NewFile_1.pdf
No meu script de shell, estou iterando cada linha e executando-a.
echo "Start!"
while read -r line
do
command "$line"
done < /tmp/DE_CopyOldToNew.txt
Ao executar o script, recebo o seguinte para cada linha lida ...
: No such file or directory6: cp /migrationfiles/Company\ Name\ GmbH/2014.138_Old\ File\ Name.pdf /appl/data/docs/202403/DE_2014.138_NewFile_1.pdf
Ao executar as linhas manualmente a partir do prompt funciona sem erros...
O problema é que você está lendo a linha inteira em uma variável de shell
line
, que você usa entre aspas (ou seja, como"$line"
).Embora geralmente seja correto colocar aspas duplas nas variáveis do shell ao usá-las, e em particular ao lidar (como você faz) com nomes de arquivos que contêm espaços ou outros caracteres "problemáticos", neste caso significa que toda a linha que consiste em o
cp
comando e seus argumentos são tratados como um único token de shell em suacommand
instrução.Isso significa que no loop, você não está executando o
cp
comando com argumentos/migrationfiles/Company\ Name\ GmbH/2014.138_Old\ File\ Name.pdf
e/appl/data/docs/202403/DE_2014.138_NewFile_1.pdf
, mas o shell tenta executar um executável chamadoonde os espaços destinados a separar o comando dos argumentos são interpretados como parte do nome do comando. É claro que este executável não existe.
O que você pode fazer é ler as linhas em três variáveis, como em:
assumindo que a estrutura é sempre da forma indicada no seu exemplo.
Observe que este
read
comando não contém a-r
opção, pois isso inibiria a interpretação do\
caractere de escape para o espaço seguinte, o que, no entanto, precisamos que o shell faça aqui.Eu não deixaria o arquivo TXT fazer nenhuma ação, mas tratá-lo como uma fonte de dados, então use o script não apenas para executar o que precisa ser executado, mas também como um controle dos dados: