Posso recarregar a variável em um comando watch?

3

Parte do meu trabalho envolve algum tratamento de dados. Uma das tarefas é "achatar" um conjunto de diretórios (que chamaremos de Dir por enquanto) e copiá-los para um novo local chamado DirFlat.

Isso pode levar muito tempo (30 minutos - > 2-3 horas)! Eu gostaria de poder assistir ao progresso, então eu uso find Dir -type f|wc -l para obter o número de arquivos (vamos chamar isso de $Filenum , e então eu corro um comando muito curto que eu escrevi (digitando de novo no meu caderno, pode copiei errado, espero que você consiga a essência):

echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)

No entanto, se eu executar watch -n 100 "!!" , ele pegará a saída do eco e continuará imprimindo (até a data não muda).

Posso obter isso para atualizar a variável / re-executar a atribuição das variáveis internas no BASH? Espero que isso me ajude a automatizar algumas das minhas tarefas.

    
por Pureferret 26.04.2013 / 12:08

4 respostas

5

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 e date , substituir a saída de cada comando pelo comando shell watch -n 100 "echo $(…) % $(…)" e executá-lo. Você precisa impedir a expansão do comando no shell pai e, em vez disso, passá-lo como uma string para watch para que ele seja executado. Esta é uma simples questão de usar aspas simples ao redor do comando, em vez de aspas duplas.

    
por 27.04.2013 / 03:13
2

Como alternativa, você pode envolvê-lo em um loop de shell:

while sleep 100; do
    (... your stuff ...)
    if [ (... process has finished ...) ]; then
        (... beep or get operator's attention otherwise ...)
        break
    fi
done
    
por 26.04.2013 / 13:45
1

Você precisa colocar isso em um shell script e deixar o watch chamar esse script.

    
por 26.04.2013 / 12:12
0

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, uma vez que tem uma condição de terminação. Essa resposta mais curta só responde à pergunta sobre como atualizar ao executar novamente o mesmo processo.

while true; do echo $(date +"%T"); sleep 1; done

O número após o sono é em segundos.

    
por 03.12.2017 / 02:17