出力(進行)の前にrclone
カスタムテキストを追加したいです。インターネット検索の最後に、私は次の解決策を思いついた。
rclone sync "$SOURCE" "$DESTINATION" | while read line; do echo " $line"; done
ただし、実際にはrclone(--progressを使用)は最初にいくつかの行を取得し、実行中に更新します。ただし、これを使用すると、while
古い行を更新するのではなく、常に新しい行を追加します。この問題を解決する方法を知っている人はいますか?
デフォルトではrclone --progress output
毎秒更新されます。
Transferred: 0 / 0 Bytes, -, 0 Bytes/s, ETA -
Checks: 97 / 97, 100%
Elapsed time: 0.0s
希望の出力:
[My text] Transferred: 0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks: 97 / 97, 100%
[My text] Elapsed time: 0.0s
実際の結果while
は更新されませんが、以下を追加します。
[My text] Transferred: 0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks: 97 / 97, 100%
[My text] Elapsed time: 0.0s
[My text] Transferred: 0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks: 97 / 97, 100%
[My text] Elapsed time: 0.0s
[My text] Transferred: 0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks: 97 / 97, 100%
[My text] Elapsed time: 0.0s
[My text] Transferred: 0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks: 97 / 97, 100%
[My text] Elapsed time: 0.0s
答え1
あなたの質問を理解したかどうかわかりません。同じ行を継続的に更新したい場合は、次のように使用できます。
rclone sync "$SOURCE" "$DESTINATION" | while read line; do echo -en " \r$line"; done
-n 末尾の改行を印刷するためにエコーを停止します。
-e はバックスラッシュシーケンスを評価するよう echo に指示します。
答え2
この種の更新を制御することは困難です。これは、すべてのプログラムが完全な更新データを常に同じ場所に送信するわけではないからです。この特別なケースでは、rclone
3つの完全なデータ行が毎秒送信されるように見えるため、これを修正して同じ場所に再描画し、新しいデータ行が前のデータより短い場合は削除する必要があります。画面上部にミックスが表示されます。私にとって最も簡単な方法は、コマンドを使用しclear
て再描画するたびにデータの左上の行のみを表示することでした。
rclone sync "$SOURCE" "$DESTINATION" | while read line; do if echo "$line" | grep -q "Transferred"; then clear; fi ; echo " $line"; done
さらに制御したい場合は、ANSIエスケープカーソル位置コードを使用して、各特定の出力行を事前定義された画面位置に正確に配置できます。これは、grep
現在印刷されている行を決定するために使用されます。あるいは、read A B C... <<<$line
各行から個々のデータフィールドを抽出し、必要に応じて出力を完全に再構成することもできます。もちろん、これを行うより効率的な方法がありますawk
。警告:rclone
出力バッファリングをオフにしても、タイムリーwhile
に再描画するためにコマンドのstdin / stdoutでこれを行う必要があるかもしれません。これに対するテストは行われなかった。
rclone.format.sh
呼び出しとデバッグを簡単にするために、スクリプト内のコマンドをグループ化することをお勧めします。rclone sync "src" "dst" | ./rclone.format
#!/bin/bash
# formatting rclone progress output
# use: rclone [options] | rclone.format.sh
#--------------------
TXTPFIX="my customized progress text"
while read LINE ; do
if echo "$LINE" | grep -iq transferred ; then
#-- erase screen on first line detected
clear
fi
#-- send modified line
echo "$TXTPFIX $LINE"
done
#-- end --#
chmod u+x rclone.format.sh
簡単なスクリプト実行を許可することを忘れないでください。