Script anexa extensão duas vezes

1

Estou executando um script rápido que converte qualquer arquivo .mov para .mp4. Isso funciona muito bem 99% do tempo, mas às vezes eu acerto uma armadilha e recebo um erro de:

  

o arquivo /home/jgeoffrey/Documents/HomeMovie/Test/year1video.mov.mov Nenhum arquivo ou diretório desse tipo

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

O que está causando isso e como faço para corrigir? Abaixo está o script:

#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
    
por user2676140 11.05.2016 / 15:32

1 resposta

1

No seu comando find :

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

você está localizando e iterando sobre .mov arquivos usando a variável f . Portanto, o valor da variável $f já contém .mov file. Por exemplo, digamos que um dos arquivos seja foo.mov .

Novamente, em avconf você 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:

  

year1video. mov.mov : Nenhum arquivo ou diretório desse tipo

Então você precisa:

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

como $mp4 já contém o nome do arquivo com .mov stripped e .mp4 adicionados.

Também cite sua variável contendo nomes de arquivos, caso contrário, ela falhará no caso de nomes de arquivos com espaços em branco.

Além disso, durante o loop de uma lista separada por novas linhas de arquivos, use while , em vez de for :

find .... | while IFS= read -r f; do .....
    
por heemayl 11.05.2016 / 15:51