Parte do meu trabalho envolve manipulação de dados. Uma das tarefas é 'achatar' um conjunto de diretórios (que chamaremosDirpor enquanto) e copie-os para um novo local chamado DirFlat.
Isso pode levar muito tempo (30 minutos ->2-3 horas)! Eu gostaria de poder observar o progresso, então eu uso find Dir -type f|wc -l
para obter o número de arquivos (vamos chamar isso $Filenum
, e então executo um comando bem curto que escrevi (redigitando do meu notebook, pode ter copiado errado, eu espero que você entenda a essência):
echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)
Porém, se eu executar watch -n 100 "!!"
ele pega a saída do echo e continua imprimindo (mesmo a data não muda).
Posso fazer isso para atualizar a variável/executar novamente a atribuição das variáveis internas no BASH? Espero que isso me ajude a automatizar algumas de minhas tarefas.
Responder1
Contraste:
$ watch -n 1 "echo $(date)"
Every 1.0s: echo Sat Apr 27 03:10:50 CEST 2013
$ watch -n 1 'echo $(date)'
Every 1.0s: echo $(date)
O que você fez foi executar echo "($ls DirFlat |wc -l)*100/$FileNum"|bc
and date
, substituir a saída de cada comando no shell command watch -n 100 "echo $(…) % $(…)"
e executá-lo. Você precisa evitar a expansão do comando no shell pai e, em vez disso, passá-lo como uma string para watch
que ele seja executado. Esta é uma simples questão de usar aspas simples no comando em vez de aspas duplas.
Responder2
Alternativamente, você pode envolvê-lo em um shell loop:
while sleep 100; do
(... your stuff ...)
if [ (... process has finished ...) ]; then
(... beep or get operator's attention otherwise ...)
break
fi
done
Responder3
Você tem que colocar isso em um script de shell e deixar watch chamar esse script.
Responder4
Um loop while com o comando que você deseja executar e o comando sleep também permitirá que você execute o comando linux repetidamente como o comando watch. Embora, neste caso específico, a resposta de @peterph seja melhor, pois possui uma condição final. Esta resposta mais curta responde apenas à pergunta sobre como atualizar ao executar novamente o mesmo processo.
while true; do echo $(date +"%T"); sleep 1; done
O número após dormir está em segundos.