私の仕事にはデータ処理も含まれています。タスクの1つは、一連のディレクトリ(ここでは「フラット化」と呼びます)を「フラット化」することです。ディレクターとりあえず、それらを 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
、各コマンドの出力をシェル コマンド に置き換えて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
実行したいコマンドと sleep コマンドを含む while ループを使用すると、watch コマンドのように linux コマンドを繰り返し実行することもできます。ただし、この特定のケースでは、終了条件があるため、@peterph の回答の方が適しています。この短い回答は、同じプロセスを再実行するときに更新する方法についての質問にのみ答えています。
while true; do echo $(date +"%T"); sleep 1; done
スリープ後の数値は秒単位です。