Este é um problema menor, mas é um pouco chato. Eu olhei e olhei para isso, mas não consigo entender por que isso está acontecendo ou como impedi-lo. Tenho vários milhares de arquivos de vídeo que estou convertendo lentamente do formato MPEG II para h.264 em contêineres MP4 por vários motivos. Cada arquivo .mpg possui um arquivo .txt e um arquivo .jpg associado a ele, e esses arquivos precisam ser alterados de "xxxxxxxxxxxxxx.mpg.txt e xxxxxxxxxxxxxxx.mpg.jpg para xxxxxxxxxxxxxxx.mp4.txt e xxxxxxxxxxxxxx.mp4.jpg , respectivamente, então os arquivos .mpg antigos precisam ser excluídos. Eu uso o seguinte script chamado mpgscan.sh para fazer exatamente isso:
#! /bin/bash
suffix=".mpg"
mpegname="$@"
filename=${mpegname%"$suffix"}
mp4name="$filename"".mp4"
if [ -s "$mp4name" ]
then
if lsof "$mp4name" > /dev/null || lsof "$mpegname" > /dev/null
then
echo "$filename in use"
else
if [[ -f "$mpegname"".txt" ]]
then
rename -f 's/\.mpg.txt$/.mp4.txt/' "$mpegname"".txt"
fi
if [[ -f "$mpegname"".jpg" ]]
then
rename -f 's/\.mpg.jpg$/.mp4.jpg/' "$mpegname"".jpg"
fi
echo "$filename removed"
rm "$mpegname"
fi
fi
A conversão dos arquivos está acontecendo em segundo plano, então de vez em quando eu atualizo os arquivos associados em lote digitando o seguinte comando:
find /RAID/Recordings -name "*.mpg" -exec mpegscan.sh {} \;
Funciona muito bem, mas em vez de obter o resultado esperado como:
/RAID/Recordings/Movies/K/K-9 (Recorded Tue Apr 01, 2008, HBOHD) removed
/RAID/Recordings/Movies/K/Kate & Leopold (Recorded Sat Sep 11, 2010, ENCR1H) removed
/RAID/Recordings/Movies/K/Kindergarten Cop (Recorded Tue May 06, 2008, HBOHD) removed
/RAID/Recordings/Movies/K/King Ralph (Recorded Wed Jul 16, 2008, HBOHD) in use
Eu recebo:
/RAID/Recordings/Movies/K/K-9 (Recorded Tue Apr 01, 2008, HBOHD) removed
find: '/RAID/Recordings/Movies/K/K-9 (Recorded Tue Apr 01, 2008, HBOHD).mpg.jpg': No such file or directory
find: '/RAID/Recordings/Movies/K/K-9 (Recorded Tue Apr 01, 2008, HBOHD).mpg.txt': No such file or directory
/RAID/Recordings/Movies/K/Kate & Leopold (Recorded Sat Sep 11, 2010, ENCR1H) removed
find: '/RAID/Recordings/Movies/K/Kate & Leopold (Recorded Sat Sep 11, 2010, ENCR1H).mpg.jpg': No such file or directory
find: '/RAID/Recordings/Movies/K/Kate & Leopold (Recorded Sat Sep 11, 2010, ENCR1H).mpg.txt': No such file or directory
/RAID/Recordings/Movies/K/Kindergarten Cop (Recorded Tue May 06, 2008, HBOHD) removed
find: '/RAID/Recordings/Movies/K/Kindergarten Cop (Recorded Tue May 06, 2008, HBOHD).mpg.jpg': No such file or directory
find: '/RAID/Recordings/Movies/K/Kindergarten Cop (Recorded Tue May 06, 2008, HBOHD).mpg.txt': No such file or directory
/RAID/Recordings/Movies/K/King Ralph (Recorded Wed Jul 16, 2008, HBOHD) in use
Eu tentei os comandos rename
e mv
com o mesmo resultado. Estou confuso. Primeiro de tudo, como/por que o erro está sendo relatado pelo find
comando? O comando find não é emitido para arquivos .jpg ou .txt, mas sim para arquivos .mpg. Mais especificamente, por que existe algum tipo de erro? Os arquivos relatados existem e estão sendo processados corretamente pelo comando mv / rename. Não só isso, mas até verifico o script para ter certeza de que eles existem antes de renomeá-los. o que estou perdendo? O script funciona perfeitamente sem erros se eu executá-lo manualmente em qualquer arquivo .mpg.
find
lê uma lista de entradas de diretório e as processa uma por uma. Para cada entrada que corresponda às suas condições, ele-exec
usa seu script de shell.Seu script então renomeia os arquivos, alterando assim a lista de entradas de diretório que
find
ainda está em processamento. Portanto,find
ainda há nomes de arquivos em sua lista de tarefas que você já removeu/renomeou.Ao
find
tentar processá-los, reclama que o arquivo não existe mais.Exemplo:
Estou usando
busybox find
aqui porque o GNU findutilsfind
já é inteligente o suficiente para lidar com esse caso. Você pode estar usando uma versão mais antiga ou até mesmo a variante busybox se este for um shell incorporado em algum tipo de NAS.Você pode ignorar esse erro se os arquivos ausentes tiverem sido ignorados pelas suas condições de qualquer maneira; alternativamente, vamos encontrar primeiro a lista de arquivos e processá-la depois.
Às vezes é suficiente usar
find -print0 | xargs -0
padrão em vez defind -exec
padrão. Ajuda se o seu shellscript puder processar vários argumentos em vez de apenas um.