Eu uso um script para converter todos os diretórios VIDEO_TS para .ISO. Como posso verificar se o genisoimage está realmente convertendo-o em vez de falhar e converter a próxima pasta?
Após a conversão, tenho um comando para excluir a pasta, mas se o genisoimage falhar, ele ainda a exclui.
#!/bin/bash
iso_name=""
parent_path=""
full_path=""
total=0
IFS=$'\n'
clear
for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do
parent_path="$(dirname -- "$file")"
full_path="$file"
iso_name="$(basename -- "$parent_path").ISO"
iso_path=""$(dirname -- "$parent_path")"/"$iso_name""
echo "Converting to "$iso_name""
((total++))
genisoimage -allow-limited-size -o "$iso_path" -dvd-video "$parent_path"
rm -rf "$parent_path"
done
echo "Succesfully converted "$total" videos to ISO!"
Responder1
Todo processo tem umstatus de saída, que é um número entre 0 e 255. Existe uma convenção que é praticamente universalmente seguida de que 0 indica sucesso e qualquer outro indica fracasso¹.
Em um script shell, a variável especial $?
contém o status de saída do último comando. Se você precisar usá-lo mais de uma vez, salve-o em outra variável (caso contrário, o primeiro comando a usá-lo será definido $?
com seu status).
Freqüentemente, você não precisa usar $?
: você pode usar as construções condicionais do shell para reagir de maneira diferente a zero e diferente de zero.
if genisoimage …; then
rm rm -rf "$parent_path"
else
echo 1>&2 "genisoimage failed, aborting"
exit 2
fi
Você pode usar set -e
para alternar o script para o modo de erro ao sair: se um comando simples falhar (ou seja, retornar um status diferente de zero), o script será encerrado imediatamente, com o mesmo status de saída. Por exemplo, se você colocar set -e
algum lugar antes do for
loop, seu script será encerrado imediatamente se genisoimage
falhar.
Se você quiser continuar em loop, mas registrar falhas, salve a contagem de erros atual em uma variável.
successes=0
failures=0
err=0
for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do
parent_path="$(dirname -- "$file")" # or parent_path=${file%/*}
iso_path="$parent_path.ISO"
echo "Converting to "$iso_name""
genisoimage -allow-limited-size -o "$iso_path" -dvd-video "$parent_path"
ret=$?
if ((ret == 0)); then
rm -rf "$parent_path"
((++successes))
else
((++failures))
if ((ret > err)); then ret=$err; fi
fi
done
echo "Succesfully converted "$total" videos to ISO. There were $failures failures."
exit $err
¹ Para comandos de pesquisa como grep
, 0 significa “encontrado”, 1 significa “não encontrado” e outros valores significam “algum erro aconteceu”.