我的部分工作涉及一些數據處理。其中一個任務是「展平」一組目錄(我們稱之為目錄暫時),並將它們複製到名為 DirFlat 的新位置。
這可能需要很長時間(30 分鐘 -> 2-3 小時)!我希望能夠觀察進度,所以我用來find Dir -type f|wc -l
獲取文件數量(讓我們稱之為$Filenum
,然後我運行我編寫的一個非常短的命令(從我的筆記本上重新輸入,可能複製錯誤,我希望你能明白要點):
echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)
但是,如果我運行watch -n 100 "!!"
它,它會獲取回顯的輸出,並繼續列印該輸出(即使日期也不會改變)。
我可以用它來刷新變數/重新運行 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
,將每個命令的輸出替換為 shell 命令watch -n 100 "echo $(…) % $(…)"
,然後運行它。您需要防止在父 shell 中擴展該命令,而是將其作為字串傳遞給watch
它以使其運行。這是一個簡單的問題,只需在命令周圍使用單引號而不是雙引號。
答案2
或者,您可以將其包裝到 shell 循環中:
while sleep 100; do
(... your stuff ...)
if [ (... process has finished ...) ]; then
(... beep or get operator's attention otherwise ...)
break
fi
done
答案3
您必須將其放入 shell 腳本中,然後讓 watch 呼叫該腳本。
答案4
使用您想要執行的命令和 sleep 命令的 while 循環也將允許您像 watch 命令一樣重複執行 linux 命令。不過,在這種特定情況下,@peterph 的答案更好,因為它有一個終止條件。這個較短的回應僅回答了重新執行同一進程時如何刷新的問題。
while true; do echo $(date +"%T"); sleep 1; done
睡眠後的數字以秒為單位。