Script acrescenta extensão duas vezes

Script acrescenta extensão duas vezes

Estou executando um script bash rápido que converterá qualquer arquivo .mov em .mp4. Isso funciona muito bem 99% das vezes, mas às vezes acerto uma armadilha e recebo um erro de:

o arquivo /home/jgeoffrey/Documents/HomeMovie/Test/year1video.mov.mov Esse arquivo ou diretório não existe

Como você pode ver, por algum motivo, a extensão do arquivo foi adicionada duas vezes ao final do arquivo? Se eu navegar para o diretório real, esse não é o caso, ele estará lá apenas uma vez.

O que está causando isso e como posso corrigir? Abaixo está o roteiro:

#Scanning Documents for any mov files
for f in $(find /home/jgeoffrey/Documents -type f -name "*.mov");
do
 #checking if a .mp4 exists
 mp4=${f%.mov}.mp4  
 #if no .mp4 exist convert the file
 if ! lsof $f && [ ! -e "$mp4" ];
 then
    #Converting the file to .mp4
    avconv -i $f.mov -codec copy $f.mp4
 fi
done

Responder1

No seu findcomando:

find /home/jgeoffrey/Documents -type f -name "*.mov"

você está encontrando e iterando .movarquivos usando variável f. Portanto, o valor da variável $fjá contém .movarquivo. Por exemplo, digamos que um dos arquivos seja foo.mov.

Novamente, avconfvocê usou o arquivo de entrada como $f.mov, então o nome do arquivo se torna

foo.mov.mov 

Isso é exatamente o que o erro diz:

ano1vídeo.mov.mov: Não existe tal arquivo ou diretório

Então você precisa de:

avconv -i "$f" -codec copy "$mp4"

como $mp4já contém o nome do arquivo .movremovido e .mp4adicionado.

Cite também sua variável que contém nomes de arquivos, caso contrário ela falhará no caso de nomes de arquivos com espaços em branco.

Além disso, ao fazer um loop em uma lista de arquivos separados por nova linha, use while, em vez de for:

find .... | while IFS= read -r f; do .....

informação relacionada