新しい行を追加する代わりに行を更新する場合は、コマンド出力の前にどのように追加しますか?

新しい行を追加する代わりに行を更新する場合は、コマンド出力の前にどのように追加しますか?

出力(進行)の前に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

この種の更新を制御することは困難です。これは、すべてのプログラムが完全な更新データを常に同じ場所に送信するわけではないからです。この特別なケースでは、rclone3つの完全なデータ行が毎秒送信されるように見えるため、これを修正して同じ場所に再描画し、新しいデータ行が前のデータより短い場合は削除する必要があります。画面上部にミックスが表示されます。私にとって最も簡単な方法は、コマンドを使用し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簡単なスクリプト実行を許可することを忘れないでください。

関連情報