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 find
comando:
find /home/jgeoffrey/Documents -type f -name "*.mov"
você está encontrando e iterando .mov
arquivos usando variável f
. Portanto, o valor da variável $f
já contém .mov
arquivo. Por exemplo, digamos que um dos arquivos seja foo.mov
.
Novamente, 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:
ano1vídeo.mov.mov: Não existe tal arquivo ou diretório
Então você precisa de:
avconv -i "$f" -codec copy "$mp4"
como $mp4
já contém o nome do arquivo .mov
removido e .mp4
adicionado.
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 .....