ダウンロードが進行中であることを確認するには、Transmission-remoteの出力テーブルを読む必要があります。現在、これは以下を介して達成されます。
trans="transmission-remote 0.0.0.0:9092 -n $user:$pass -l"
[ "$($trans | awk '! /awk/ && /n[/]a/ {print $2}')" == "n/a" ] \
|| [[ $($trans | awk '! /awk/ && /%/ {print substr($2, 1, length($2)-1)}' | sort -n | head -n 1) -lt 100 ]]
文字列 "n/a" があるか、完了 <100% があるかどうかを探します。作成された方法によれば、同じテーブルに対して「リモート転送」を2回調べる必要があります。
サンプルテーブル出力:
ID Done Have ETA Up Down Ratio Status Name
1 100% 3.38 GB Done 0.0 0.0 1.00 Finished Fish Documentary.mkv
2 100% 5.87 GB Unknown 0.0 0.0 0.00 Idle Ethical Coding.pdf
3 100% 1.33 GB Done 0.0 0.0 1.99 Finished Bacon.jpg
4 100% 1.26 GB Unknown 0.0 0.0 0.00 Idle Eggs.png
5 100% 10.89 GB Done 0.0 0.0 1.00 Finished Invest in gold.pdf
Sum: 23.63 GB 0.0 0.0
awkパラメータを1つにまとめることは可能ですか?それとも、誰かが望む結果を得るためのより簡単なまたはきれいな方法を提案できますか?
究極の目標は、ダウンロード中にNASの赤いLEDが赤く点滅し、すべてのダウンロードが完了したら白く変わるようにすることです。
元のスクリプトは次のとおりです。https://pastebin.com/tKXc8mFW
答え1
Pastebinの投稿のコードを見て、次のように考えます。
trans="transmission-remote 0.0.0.0:9092 -n $user:$pass -l"
while
[ "$($trans | awk '! /awk/ && /n[/]a/ {print $2}')" == "n/a" ] \
|| [[ $($trans | awk '! /awk/ && /%/ {print substr($2, 1, length($2)-1)}' | sort -n | head -n 1) -lt 100 ]] \
|| find $dir -mindepth 1 -maxdepth 1 | read
do
sleep 10
done
次のようにする必要があります(テストされていません)。
downloading() {
transmission-remote '0.0.0.0:9092' -n "$user:$pass" -l |
awk '($2 ~ "[/%]") && ($2+0 < 100){f=1; exit} END{exit !f}' ||
find "$dir" -mindepth 1 -maxdepth 1 | read -r
}
while downloading; do
sleep 10
done
説明する:
あなたの質問の表はサンプル入力かもしれませんが、探したい値が含まれていないようです。
「該当なし」文字列が存在するか、完了レベルが<100%です。
私の考えでは、与えられたコードの2番目の列にある必要があるため、テストには役立ちません。
次の目標値の一部を含めるように変更すると、次のようになります。
$ cat file
ID Done Have ETA Up Down Ratio Status Name
1 100% 3.38 GB Done 0.0 0.0 1.00 Finished Fish Documentary.mkv
2 25% 5.87 GB Unknown 0.0 0.0 0.00 Idle Ethical Coding.pdf
3 100% 1.33 GB Done 0.0 0.0 1.99 Finished Bacon.jpg
4 77% 1.26 GB Unknown 0.0 0.0 0.00 Idle Eggs.png
5 n/a 10.89 GB Done 0.0 0.0 1.00 Finished Invest in gold.pdf
これを変更してください:
trans="transmission-remote 0.0.0.0:9092 -n $user:$pass -l"
これに関して:
trans() { transmission-remote '0.0.0.0:9092' -n "$user:$pass" -l; }
他の問題を解決するには、コードを変数ではなく関数に保存する必要があります(参照:https://mywiki.wooledge.org/BashFAQ/050) 次のように変更します。
trans() { cat file; }
それでは、上記の入力でテストしてみましょう。その後、好きなように聞こえます。
$ trans | awk '($2 ~ "[/%]") && ($2+0 < 100)'
2 25% 5.87 GB Unknown 0.0 0.0 0.00 Idle Ethical Coding.pdf
4 77% 1.26 GB Unknown 0.0 0.0 0.00 Idle Eggs.png
5 n/a 10.89 GB Done 0.0 0.0 1.00 Finished Invest in gold.pdf
しかし、あなたの質問に予想される結果がないことを考慮すると、これは単なる推測です。
いずれかの条件が満たされた場合、成功/失敗終了ステータスを取得したい場合があります。この場合、状況は次のとおりです。
$ if trans | awk '($2 ~ "[/%]") && ($2+0 < 100){f=1; exit} END{exit !f}'; then
echo "found it"
fi
found it
trans
または、awkスクリプトが正常に終了するまで(つまり、ターゲットが見つからないことを意味する)、毎秒呼び出されるループでこれを実行したい場合:
$ while trans | awk '($2 ~ "[/%]") && ($2+0 < 100){f=1; exit} END{exit !f}'; do
echo "flash red"
sleep 1
done
flash red
flash red
flash red
flash red
答え2
次のAWK呼び出しは、2番目の列に「n / a」がある場合、または2番目の列が100%未満の場合は正常に終了し、それ以外の場合は失敗します。
awk 'BEGIN { r = 1 } $2 == "n/a" || ($2 ~ "%" && int($2) < 100) { r = 0; exit } END { exit r }'
あなたのスクリプトでは
while
$trans | awk 'BEGIN { r = 1 } $2 == "n/a" || ($2 ~ "%" && int($2) < 100) { r = 0; exit } END { exit r }' \
|| find $dir -mindepth 1 -maxdepth 1 | read
do
sleep 10
done
AWKスクリプトは、列2で「n / a」を見つけるか、整数に変換するときに100未満のパーセンテージ値を見つけます。