Eu recomendaria echo
ing uma cópia da linha quando o download falha, em vez de revisar os nomes dos arquivos analisando cada linha no arquivo depois:
[[ -f $1 ]] || { echo "$1 not found" >&2; exit 1; }
while read -r line; do
$line || echo "$line" >> stillneed
done < "$1"
Isso seria mais eficiente e também significa que você não precisa se preocupar com nomes estranhos de arquivos no futuro (por exemplo, com espaços dentro).
Se você quiser melhorar seu método existente, poderá usar a expansão de parâmetro padrão:
for f; do
while read -r line; do
for item in $line; do
[[ $item = out_fname=* ]] || continue
[[ -f ${item#out_fname=} ]] || echo "$line"
break # assuming one fname per line
done
done < "$f"
done > stillneed
.. mas considere o que acontece com: out_fname='foo bar.ext'
. Além disso, lembre-se de que isso verifica cada linha após o evento, quando poderíamos ter verificado se o comando funcionava no momento em que o executamos.
Abrir stillneed
uma vez para todo o loop é mais eficiente; Eu não fiz isso no primeiro snippet, já que provavelmente gostaríamos de ver a saída dos comandos de download. Aqui há apenas testes, nenhum comando externo é executado, portanto, faz sentido abrir o arquivo uma vez. (Observação usando >
truncará o arquivo no início; usei for f
para permitir mais de um arquivo de entrada como parâmetros posicionais: adicionar o mesmo acima deve ser fácil se você precisar dele.)
A única coisa que devo enfatizar é a citação: echo "$line"
é muito diferente de echo $line
. Em geral, cite expansões de parâmetros all (isso inclui variáveis), a menos que você tenha certeza de que deseja que a divisão de campos ocorra.