回答編集履歴

1

追記

2022/08/29 10:22

投稿

otn
otn

スコア84559

test CHANGED
@@ -4,4 +4,36 @@
4
4
  無反応では無く、単に処理中なだけでしょう。
5
5
 
6
6
  全ファイル処理するのをtotal回数繰り返している。
7
+ ## 追記
8
+ `xarg -P 8`でパラレルに実行しつつカウントするのは難しいかと思いましたが、ループの外でやれば出来ますね。
9
+ `xargs`の中で`echo`した行を`for`の中で`read`して1ファイル処理したことを確認します。
10
+ ```Bash
11
+ #!/bin/sh
7
12
 
13
+ total=$(find . -name "*.jpg" -or -name "*.jpeg" -or -name "*.png" | wc -l)
14
+ echo "$total"
15
+
16
+ box_width=40
17
+
18
+ find . -name "*.jpg" -or -name "*.jpeg" -or -name "*.png" |
19
+ xargs -P 8 -L 1 -I {} bash -c 'cwebp $1 -o $1.webp >/dev/null 2>&1; echo' {} |
20
+ for i in $(seq 1 "${total}"); do
21
+ read
22
+ bar_width=$(( box_width * i / total ))
23
+ space=$(( box_width - bar_width ))
24
+ percent=$(( i * 100 / total ))
25
+ printf '\r['
26
+ yes "#" | head -n "${bar_width}" | tr -d "\n"
27
+ yes " " | head -n "${space}" | tr -d "\n"
28
+ printf "] %s%%" "${percent}"
29
+ done
30
+
31
+ printf '..done\n'
32
+ ```
33
+ なお、`find . -type f -name "*.jpg" -or -name "*.jpeg" -or -name "*.png"`というのは、`-or`の結合優先度が低いので、
34
+ 冗長な括弧を付けると、`find . \( -type f -name "*.jpg" \) -or -name "*.jpeg" -or -name "*.png"`と同じ意味になります。
35
+ つまり`-type f`は`-name "*.jpg"`にしか効いていません。
36
+ まあ、`.jpeg`や`.png`で終わる名前のディレクトリはないでしょうから実害はないでしょうが。上記例では`-type f`は削りました。
37
+
38
+ # `cwebp`コマンドのエラー出力まで捨ててますが、エラー発生を考慮しなくて大丈夫でしょうか?エラーは絶対発生しない??
39
+