画像を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
。-r
rm
スクリプトは、コマンドラインからの複数のディレクトリのインポートもサポートします。
を使用せずにfind
:bash
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