サフィックスバージョンなしでファイルを見つける方法は?

サフィックスバージョンなしでファイルを見つける方法は?

何百万ものファイルがあり、各ファイルのバージョン(->)を生成したいと.jpg思います。これを行うには、バージョンなしで終了するすべてのファイルを見つける必要があります。.jpg.webpfoo.jpgfoo.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

私は次のことをします:

  1. すべてのサフィックス(例*.jpg.webp:)ファイルを見つけて、ソートされたリストに入れます。サフィックスを削除します。;
  2. サフィックス(例:)を持たないすべてのファイルを見つけて、*.jpg2番目のソートリストに入れます。
  3. 2つのリストを比較し、最初のリストから項目を削除します。
  4. 結果 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機能します)。

おすすめ記事