ln -s remove parte de um nome de arquivo, quando o nome do arquivo é passado como uma variável

0

Eu uso um script para vincular alguns dos arquivos que baixei para um diretório diferente. Quando houver "-" no nome do arquivo, ln - s não lerá o caminho corretamente, mesmo que a variável seja registrada corretamente no arquivo de log que eu uso.

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

Essa é a 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

Mesmo que a variável downloadedFile seja registrada com o caminho correto:

'/home/user/Downloads/Parks And Recreation - Season 3 - DVDRip-REWARD/Parks.and.Recreation.S03E01.DVDRip.XviD-REWARD.avi'

Parece que, por algum motivo, quando $ downloadedFile é expandido para que o ln funcione com ele, omitirá parte do nome do arquivo, do primeiro "-" para o próximo "/" (- Season 3 - DVDRip -REWARD "). Não consigo encontrar uma boa razão para isso acontecer, e quero evitá-lo, qualquer sugestão ...

EDIT: Eu reescrevi o script e o problema desapareceu. Obrigado a todos que ajudaram

    
por deckoff 12.07.2015 / 21:57

1 resposta

2

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")
    
por 13.07.2015 / 00:40