Como saber se o arquivo já terminou de ser baixado na linha de comando do linux?

3

Se você está baixando um arquivo grande no linux via linha de comando, existe um comando para saber se já está concluído? Atualmente, estou apenas verificando se o tamanho do arquivo é o mesmo que o tamanho esperado do arquivo, mas e se você não souber o tamanho esperado do arquivo? Atualmente, ls mostra o nome exato do arquivo (ou seja, file.zip ) em vez de algo como file.zip.temp ou algo parecido com o download atual do arquivo.

    
por IMB 21.10.2012 / 15:00

6 respostas

6

Se você estiver fazendo o download com wget , basta verificar se a instância ainda está em execução:

ps -ef | grep wget | grep -v grep

Além disso, você pode verificar se o arquivo ainda está aberto por wget . Obviamente, substitua o caminho aqui.

lsof /path/to/downloaded/file
    
por 21.10.2012 / 15:38
3

Se você não precisa executar o wget em segundo plano, não faça isso, isso só causará complicações.

Defendo soluções como a verificação de ps -C wget ou pidof wget (menores, talvez não POSIX, equivalentes a ps -ef | grep wget | grep -v grep ), pois eles considerarão qualquer wget e não apenas o que você está interessado, pode ser uma suposição irrealizável se a sua máquina não fizer apenas uma tarefa.

Se você estiver dentro de um script, poderá wget & WGETPID=$! e, em seguida, verificar esse PID. Ou você poderia simplesmente wait , o que esperaria que seus processos em segundo plano terminassem.

Pode ser importante fazer algo para distinguir entre um download bem-sucedido e um download mal-sucedido. if wget ... ; then touch wget_ok ; else touch wget_error ; fi

    
por 22.10.2012 / 10:58
2

E se você estiver executando mais de um comando wget ?

Se você precisar se adaptar a esse cenário, faça algumas coisas diferentes:

  • Você pode canalizar o progresso para um arquivo com um nome conhecido e verificar isso.
  • Você poderia forçar a ideia que você tinha em sua pergunta, baixar para um arquivo temporário e, em um segundo comando, renomeá-lo.
  • Você pode escrever um token depois que o processo for concluído, ou seja,

    wget 'file'; touch file.is.done
    
por 21.10.2012 / 15:56
1

A abordagem lsof sugerida pelo slhck é provavelmente o melhor caminho. Se você quiser usar as outras sugestões que envolvem a criação de um arquivo quando o download estiver concluído, use && em vez de ; para que um relatório seja gerado apenas se o download sair corretamente:

wget file && touch file.is.done
    
por 24.10.2012 / 14:35
0

Eu prefiro sinal de som, então se eu começar uma operação longa (não apenas wget, mas sempre consumindo tempo resourse) que eu não quero assistir instantaneamente eu uso algo como

'LONG_COMMAND && SOUND_OK || SOUND_ERROR'

assim, mesmo que eu precise saber imediatamente quando terminar, também serei capaz de fazer outra coisa ao mesmo tempo sem me interromper periodicamente para a verificação, só posso ouvir o resultado (de SOUND_OK se primeiro comando O status de saída é 0 e SOUND_ERROR no outro caso) e verifique apenas uma vez quando terminar. Você pode até mesmo continuar a atividade atual se apenas precisar saber que sua tarefa foi concluída. LONG_COMMAND poderia ser wget , e como SOUND_OK eu prefiro echo -e "\a" >/dev/console , mas você pode usar o comando para reproduzir qualquer amostra de áudio.

Desde que wget possa produzir vários códigos de saída diferentes, pode-se usá-los para determinar o comando de alarme em "bios-style" como segue

wget URL;\
CODE=$?;\
beep;\
[ $CODE -gt 0 ] && while true; do
 for peek in 'seq 1 $CODE'; do
 beep; sleep 1;done
sleep 3; done
    
por 09.10.2014 / 02:10
0

você pode iniciar o wget com a opção -o dl.log, ou seja, para definir um arquivo de log que você pode verificar periodicamente para ver se você verá (usando expressão regular) essa linha.

12:59:48 (126.32 MB/s) - '/path/to/downloaded/file/some_file.zip' saved [95235097/95235097]

na verdade, você pode usar "tail dl.log" para obter apenas as últimas linhas em vez de ler a coisa toda.

    
por 11.08.2015 / 12:05