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 -l
para obtener la cantidad de archivos (llamémoslo $Filenum
y 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"|bc
y date
sustituir 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 watch
que 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.