O script, o arquivo de dados e a saída que você publicou são inconsistentes. Nem o script nem o arquivo de dados contêm mv
, mas sua captura de tela é. Além disso, sua captura de tela menciona uma linha 28, que o script que você postou não tem. É difícil identificar seu problema quando você nos fornece informações inconsistentes.
Dito isto, você está tentando fazer uma das duas coisas, nenhuma das quais pode funcionar do jeito que você está tentando.
-
Se o arquivo de entrada contiver linhas como
mv "02 - Beautiful Emptiness.mp3" 1.mp3
então é realmente um script de shell. Em vez de ler linha por linha, execute-o como um script de shell. Certifique-se de que você pode confiar neste arquivo, já que você estará executando o que estiver lá, incluindo
rm -rf ~
ou algo assim.. inp2.sh
-
Se o arquivo de entrada contiver linhas como
"02 - Beautiful Emptiness.mp3"
então a maneira como você está lendo não funciona.
read LINE
faz o seguinte:- leia uma linha;
- se essa linha terminar com uma barra invertida, remova a barra invertida e leia outra linha (repita até que uma linha que não termine com
\
foi lida); - substituir todas as seqüências de caracteres de barra invertida + caracteres pelo segundo caractere somente;
- defina
LINE
para a concatenação das linhas lidas, menos as novas linhas.
Quando o shell executa o comando
$LINE
, ele faz o que sempre faz quando vê uma substituição de variável fora das aspas, que é:- divida o valor da variável em uma lista de palavras em todos os lugares onde ele contém espaço em branco (assumindo o valor padrão de
IFS
); - trate cada palavra como um padrão glob e expanda-a se corresponder a pelo menos um arquivo.
Parece inútil? Isto é. E note que não há nada sobre aspas aqui: as citações fazem parte da sintaxe do shell, elas não fazem parte das regras de expansão do shell.
O que você deve fazer é ter inp2.txt
contendo uma lista de nomes de arquivos, um por linha. Veja Por que é 'while IFS = read' usado com muita frequência, em vez de 'IFS =; while read .. '? para saber como ler uma lista de linhas de um arquivo. Você estará querendo algo como
i=1
while IFS= read -r source; do
dir=$(dirname -- "$source")
ext=
case "${source##*/}" in
*.*) ext=.${source##*.};;
esac
mv -- "$source" "$dir/$i$ext"
done <inp2.txt
Apenas pela perfeição, mencionarei outra possibilidade, mas não a recomendo porque é complicada e não permite que você faça o que parece estar fazendo. Um arquivo como
"02 - Beautiful Emptiness.mp3" "02 - Come. mp3" foo\ bar.mp3
então ele pode ser lido pelo comando xargs
. A entrada para xargs
é uma lista de elementos delimitados por espaço em branco, que pode ser um literal (possivelmente contendo espaços em branco) entre aspas simples, um literal (possivelmente contendo espaço em branco) entre aspas duplas ou um literal sem aspas que pode conter escapes de barra invertida ( \
cita o próximo caractere). Observe que a sintaxe xargs
é diferente de qualquer coisa que o shell possa reconhecer.