画像変換bashスクリプトが機能しない

画像変換bashスクリプトが機能しない

画像をwebp形式に変換できるスクリプトが見つかりました。

#!/bin/bash -x

# converting JPEG images
find $1 -type f -and \( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec bash -c '
webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
cwebp -quiet -q 90 "$0" -o "$webp_path";
rm -rf $webp_path;' {} \;

入力として提供されるフォルダは次のとおりです。

root@ip-10-0-1-46:/var/images/newlocallego/12345# tree
.
└── 01234
    ├── 001.jpg
    ├── 002.jpg
    ├── index.htm
    └── main.jpg

1 directory, 4 files

私は処刑中です。./webpconvert.sh /var/images/newlocallego/12345

しかし、webpファイルを生成せず、jpgファイルを削除したり、エラーは発生しません。何か抜けました。

ベストアンサー1

出力ファイルは生成されるとすぐに削除されます。また、bash -cスクリプトの周りのコマンドの置き換えに引用符を使用する際に問題があり、sedまったく参照されないいくつかの変数のインスタンスがあります。

修正されたバリエーション:

find "$@" -type f \( -iname '*.jpg' -o -iname '*.jpeg' \) -exec bash -c '
    for pathname do
        cwebp -quiet -q 90 -o "${pathname%.*}.webp" -- "$pathname" &&
        rm -f -- "$pathname"
    done' bash {} +

bash -c検索されたファイルをファイルごとに1回呼び出すのではなく、一括で呼び出すことで、より効率的に操作できます。

cwebp正常に終了しないと、元のファイルは削除されません。ファイル名サフィックスは、を.webp使用する代わりに、標準の引数置換を使用して元のファイル名サフィックスを置き換えますsed-rrm

スクリプトは、コマンドラインからの複数のディレクトリのインポートもサポートします。

を使用せずにfindbash

shopt -s nullglob dotglob nocaseglob
shopt -s globstar

for dirpath do
    for pathname in "$dirpath"/**/*.{jpg,jpeg}; do
        [ ! -f "$pathname" ] && continue
    
        cwebp -quiet -q 90 -o "${pathname%.*}.webp" -- "$pathname" &&
        rm -f -- "$pathname"
    done
done

唯一の違いは、bashループがパターンに一致する通常のファイルへのシンボリックリンクも処理することです。これが問題の場合は、-f内部ループのテストを次に変更します。

if [ ! -f "$pathname" ] || [ -h "$pathname" ]; then
    continue
done

おすすめ記事