¿Puedo recargar la variable en un comando de vigilancia?

¿Puedo recargar la variable en un comando de vigilancia?

Parte de mi trabajo implica cierto manejo de datos. Una de las tareas es "aplanar" un conjunto de directorios (que llamaremosDirectoriopor ahora) y cópielos en una nueva ubicación llamada DirFlat.

¡Esto puede llevar mucho tiempo (30 minutos ->2-3 horas)! Me gustaría poder ver el progreso, así que uso find Dir -type f|wc -lpara obtener la cantidad de archivos (llamémoslo $Filenumy luego ejecuto un comando muy corto que escribí (al volver a escribir desde mi cuaderno, es posible que lo haya copiado mal, no Espero que entiendas la esencia):

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

Sin embargo, si lo ejecuto, watch -n 100 "!!"toma la salida del eco y sigue imprimiéndola (incluso la fecha no cambia).

¿Puedo hacer que esto actualice la variable/vuelva a ejecutar la asignación de las variables internas en BASH? Espero que esto me ayude a automatizar algunas de mis tareas.

Respuesta1

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)

Lo que ha hecho es ejecutar echo "($ls DirFlat |wc -l)*100/$FileNum"|bcy datesustituir la salida de cada comando en el comando del shell watch -n 100 "echo $(…) % $(…)"y ejecutarlo. Debe evitar la expansión del comando en el shell principal y, en su lugar, pasarlo como una cadena para watchque se ejecute. Se trata simplemente de utilizar comillas simples alrededor del comando en lugar de comillas dobles.

Respuesta2

Alternativamente, puedes envolverlo en un bucle de shell:

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

Respuesta3

Tienes que poner esto en un script de shell y dejar que watch llame a este script.

Respuesta4

Un bucle while con el comando que desea ejecutar y el comando de suspensión también le permitirán ejecutar el comando de Linux repetidamente como el comando de vigilancia. Aunque, en este caso específico, la respuesta de @peterph es mejor ya que tiene una condición terminal. Esta respuesta más corta solo responde a la pregunta sobre cómo actualizar cuando se vuelve a ejecutar el mismo proceso.

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

El número después de dormir está en segundos.

información relacionada