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")