Часть моей работы включает в себя обработку данных. Одна из задач — «сгладить» набор каталогов (который мы назовемРежиссёр(на данный момент) и скопируйте их в новое место под названием DirFlat.
Это может занять много времени (30 минут ->2-3 часа)! Я хотел бы иметь возможность следить за ходом процесса, поэтому я использую , find Dir -type f|wc -l
чтобы получить количество файлов (назовем это $Filenum
, а затем запускаю очень короткую команду, которую я написал (перепечатываю из своего блокнота, возможно, скопировал неправильно, надеюсь, вы уловили суть):
echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)
Однако если я запущу его, watch -n 100 "!!"
он возьмет вывод echo и продолжит его печатать (даже дата не изменится).
Могу ли я получить это для обновления переменной/повторного запуска назначения внутренних переменных в BASH? Надеюсь, это поможет мне автоматизировать некоторые из моих задач.
решение1
Контраст:
$ 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)
То, что вы сделали, это запустили echo "($ls DirFlat |wc -l)*100/$FileNum"|bc
и date
, подставили вывод каждой команды в оболочку command watch -n 100 "echo $(…) % $(…)"
и запустили ее. Вам нужно предотвратить расширение команды в родительской оболочке и вместо этого передать ее как строку для watch
ее запуска. Это просто вопрос использования одинарных кавычек вокруг команды вместо двойных.
решение2
В качестве альтернативы вы можете обернуть его в цикл оболочки:
while sleep 100; do
(... your stuff ...)
if [ (... process has finished ...) ]; then
(... beep or get operator's attention otherwise ...)
break
fi
done
решение3
Вам нужно поместить это в скрипт оболочки и позволить watch затем вызывать этот скрипт.
решение4
Цикл while с командой, которую вы хотите запустить, и командой sleep также позволит вам многократно запускать команду linux, как и команду watch. Хотя в этом конкретном случае ответ @peterph лучше, так как в нем есть условие завершения. Этот более короткий ответ отвечает только на вопрос о том, как обновиться при повторном запуске того же процесса.
while true; do echo $(date +"%T"); sleep 1; done
Число после сна указывается в секундах.