何百万ものファイルがあり、各ファイルのバージョン(->)を生成したいと.jpg
思います。これを行うには、バージョンなしで終了するすべてのファイルを見つける必要があります。.jpg.webp
foo.jpg
foo.jpg.webp
.jpg
.jpg.webp
今私はそうします:
find "$path" -type f -iname "*.jpg" |
while read -r image_path; do
if [ ! -f "$image_path.webp" ]; then
echo "$image_path"
fi
done |
# treat only 10000 files per run
head -n 10000 |
...
ただし、パイプを使用しているため、サブシェルが作成されます。これを行うより効率的な方法があるかどうか疑問に思います。特に、生成するWebPイメージが多いほど、スクリプトは候補を見つけるためにパスをフィルタリングするのに時間がかかるためです。 justを使ってこれを行う方法はありますかfind
?
Ubuntu 20.04を使用しています。ファイルはサブディレクトリに配布されます。
ベストアンサー1
私は次のことをします:
- すべてのサフィックス(例
*.jpg.webp
:)ファイルを見つけて、ソートされたリストに入れます。サフィックスを削除します。; - サフィックス(例:)を持たないすべてのファイルを見つけて、
*.jpg
2番目のソートリストに入れます。 - 2つのリストを比較し、最初のリストから項目を削除します。
- 結果 Set Differences リストから変換を実行します。
そのように
#!/bin/bash
comm -z -1 -3 \
<(find -name '*.jpg.webp' -print0 | sed 's/\.webp\x0/\x0/g' | sort -z) \
<(find -name '*.jpg' -print0 | sort -z) \
| parallel -0 gm convert '{}' '{}.webp'
変換にGraphicsMagickを使用しgm
(私の経験上の速度と安定性のためにImageMagickを好むconvert
)、GNUがインストールされているとしますparallel
(そうでない場合はxargs
機能します)。