verificar se o genisoimage é bem sucedido

1

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 fazer a conversão e converter a próxima pasta?

Após a conversão, tenho um comando para excluir a pasta, mas se a genisoimage falhar, ela ainda a excluirá.

#!/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!"
    
por NullBy7e 13.05.2014 / 19:42

1 resposta

0

Todo processo tem um status de saída , que é um número entre 0 e 255. Existe uma convenção que é bonita muito universalmente seguido que 0 indica sucesso e qualquer outra coisa indica falha¹.

Em um script de 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 usando-o definirá $? como seu status).

Geralmente, 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 (isto é, retornar um status diferente de zero), o script sairá imediatamente, com o mesmo status de saída. Por exemplo, se você colocar set -e em algum lugar antes do loop for , seu script sairá imediatamente se genisoimage falhar.

Se você quiser manter o 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 busca como grep , 0 significa “encontrado”, 1 significa “não encontrado” e outros valores significam “algum erro aconteceu”.

    
por 14.05.2014 / 03:06