シーケンシャル機能で画像のサイズを変更するには?

シーケンシャル機能で画像のサイズを変更するには?

努力しています:

  • 私の画像形式を変更し、
  • 次に、高さと幅を40%に調整します。
  • その後、品質はソースの最大35%に最適化され、画像の合計サイズはソースの最大35%に最適化されます。

これは私のコードです。

find . -name '*.png' -exec mogrify -format jpg {} + &&
find . -name '*.{jpeg,jpg}' -exec convert -resize 40% _resized.jpg {} + &&
find ./*.{jpeg,jpg} -exec jpegoptim   -m 35%  --size=35% {} \;

サイズ変更 - 2行目 - 失敗したようです。画像のプロパティを見ると、同じ画像サイズが得られます。

新しい画像のサイズを変更したいです。 - 元の名前+名前の末尾に「Resize」という単語がなければなりません。

ベストアンサー1

2番目のコマンドの主な問題は、中find括弧拡張を理解していないため、{jpeg,jpg}リテラル文字列として扱うことです。 2番目の問題は、{} +パラメータ型を使用して複数のファイルをconvert

注:echo以下のコマンドが正しい操作を実行すると満足している場合にのみ削除してください。

おそらくあなたが望むものは次のとおりです。

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec sh -c '
  for f; do 
    ext="${f##*.}"; echo convert -resize 40% "$f" "${f%.*}_resized.$ext"
  done
' find-sh {} +

\(...バインディング率が強いため、括弧が\)必要です。そのファイルがない場合は、一致するファイルを見つけることができますが、変換されません。-exec-o-name '*.jpeg'

出力ファイル名がそれほど難しくない場合は、上記の内容を次のように単純化できます。

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec sh -c '
  for f; do 
    echo convert -resize 40% "$f" "${f%.*}_resized.jpg"
  done
' find-sh {} +

.jpg(元のファイルの拡張子があっても出力ファイルは拡張子として生成されます.jpeg。)

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec sh -c '
  for f; do 
    echo convert -resize 40% "$f" "${f}_resized.jpg"
  done
' find-sh {} +

(これにより、同様の出力ファイルが生成されますfoo.jpeg_resized.jpg)。

効率性に興味がない場合は、見つかったファイルごとにシェル呼び出しを実行してシェルループをキャンセルできます。

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec sh -c '
  echo convert -resize 40% "$1" "${1}_resized.jpg"
' find-sh {} \;

3番目のコマンドで参照してください。

find ./*.{jpeg,jpg} -exec jpegoptim   -m 35%  --size=35% {} \;

あなたのシェル引用されていないを拡張することは可能です{jpeg,jpg}が、それはあなたが望むものではありません。繰り返しますが、これは次のようになります。

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec jpegoptim -m 35%  --size=35% {} \;

おすすめ記事