다운로드가 진행 중인지 확인하려면 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%가 있는지 찾습니다. 작성된 방식에 따르면 동일한 테이블에 대해 "원격 전송"을 두 번 조사해야 합니다.
샘플 테이블 출력:
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 매개변수를 하나로 결합하는 것이 가능합니까? 아니면 누군가 원하는 결과를 얻기 위한 더 간단하거나 깔끔한 방법을 제안할 수 있습니까?
궁극적인 목표는 다운로드하는 동안 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%입니다.
내 생각에는 주어진 코드의 두 번째 열에 있어야 하므로 테스트에 유용하지 않습니다.
다음 목표 값 중 일부를 포함하도록 수정하면 다음과 같습니다.
$ 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 호출은 두 번째 열에 "n/a"가 있거나 두 번째 열이 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보다 작은 백분율 값을 찾습니다.