Even though the variable downloadedFile is logged with the correct path:
'/home/user/Downloads/Parks And Recreation - Season 3 - DVDRip-REWARD/Parks.and.Recreation.S03E01.DVDRip.XviD-REWARD.avi'
Esse não é, evidentemente, o caminho correto: ele tem caracteres '
extras no início e no final. Você pode ver isso na mensagem de erro de ln
:
ln: failed to create symbolic link ‘'/home/user/Videos/TVEpisodes/Parks and Recreation/Parks.and.Recreation.S03E01.DVDRip.XviD-REWARD.avi'’ -> ‘’: No such file or directory
A mensagem de erro tem o nome do arquivo dentro de 'aspas simples', e há caracteres '
(aspas simples) ASCII extras no início e no final.
O problema em seu script é óbvio: você está adicionando caracteres '
extras ao definir aviMp4name
, linkAviFile
e downloadedFile
. Não faça isso.
for f in "${AVIFILES[@]}"
do
BaseAviName=$(basename -- "$f" .avi)
aviMp4name="$targetdir/$BaseAviName.mp4"
linkAviFile="$targetdir/$f"
downloadedFile=$("$theFile/$f")
ln -s -- "$downloadedFile" "$linkAviFile" >>$logPath 2>&1
echo "fileIs: " "$f" ",linkAviFile is" "$linkAviFile" ",BaseAviName:" "$BaseAviName" '$aviMp4name: ' "$aviMp4name" '$downloadedFile: ' "$downloadedFile" >> "$logPath"
done
Na sintaxe de origem do shell , as aspas simples delimitam as sequências literais, por exemplo, a='hello world!'
define a variável a
para a sequência de 12 caracteres hello world!
. Se você colocar aspas simples em em uma variável , você receberá aspas simples: a="'hello world!'"
sets a
para a string de 14 caracteres 'hello world!'
.
A principal coisa a ser lembrada com citações em scripts de shell é colocar aspas duplas em torno das expansões de variáveis, por exemplo, %código%. Código como ln -s -- "$downloadedFile" "$linkAviFile"
dividiria os valores das variáveis ln -s -- $downloadedFile $linkAviFile
e downloadedFile
nos caracteres de espaço em branco e interpretaria cada parte como um padrão de caractere curinga. Essas aspas duplas fazem parte da sintaxe da fonte do shell e são interpretadas pelo analisador. Colocar aspas no valor de uma variável não resolve nada.
Observe também que, se um nome de arquivo começar com linkAviFile
, ele será interpretado como uma opção pelo comando. Para evitar isso, quando você tiver nomes de arquivos em variáveis, passe o argumento -
para o comando depois de todas as opções e antes de todos os nomes de arquivos (você pode omitir --
se tiver certeza de que os nomes de arquivo não começam com --
, por exemplo, se você sabe que eles são caminhos absolutos). -
significa "não há mais opções depois desse ponto".
Observe que --
, como qualquer outra expansão sem aspas, dividiria o valor da variável no espaço em branco. Para armazenar vários nomes de arquivos em uma variável, crie uma matriz em vez de uma string; isso requer ksh, bash ou zsh, ele não funciona em sh simples:
AVIFILES=(foo.avi bar.avi "file name with spaces.avi")