繰り返しサムネイルの作成と移動

繰り返しサムネイルの作成と移動

以下を実行するbashスクリプトが必要です。

  • 現在のディレクトリから下に画像(jpg、jpeg、JPG、JPEG)を繰り返し検索します。
  • imagemagickの変換を使用してサムネイルを生成する
  • サムネイルを別のディレクトリに移動

私の現在のスクリプトは次のとおりです。

for f in `find . -type f -iname "*.jpg"`
  do
  convert ./"$f" -resize 800x800\> ./"${f%.jpg}_thumb.jpg"
  mv ./"${f%.jpg}_thumb.jpg" /home/user/thumbs/
done

スペース/特殊文字を含むファイル(またはすべての内容を含むフォルダ)は変換されません。私は試しましたが役に立ちprint0ませんでした。

答え1

出力を繰り返さないでくださいfind。あなたが経験している問題は、この状況の典型的な結果です。

あなたの例は、ファイルの名前変更のために少しトリッキーです。非常に効率的ではありませんが、安全なアプローチは、次のようにファイルごとに追加オプションを使用すること-execです。findsh

find . -type f -iname "*.jpg" -exec sh -c 'echo convert "$1" -resize 800x800\> /home/user/thumbs/"${1%.jpg}_thumb.jpg"' -- {} \;

同じ名前を使用することをお勧めします(.jpg代わりにサフィックスを使用_thumb.jpg)、次の単純な形式が機能し、より効率的です。

find . -type f -iname "*.jpg" -exec echo convert "{}" -resize 800x800\> /home/user/thumbs/"{}" \;

echoコマンドを実行する前に、出力を確認するためにステートメントを追加しました。出力が良く見える場合は削除してください。

答え2

次の高度なオプションを使用できます。-set結合する脱出率%tつまり、ディレクトリや拡張子のないファイル名の抽出)各ファイルは単一の呼び出しでサイズ変更、名前変更、および移動できますconvert

find . -type f -iname \*.jpg -exec convert {} -resize 800x800\> \
-set filename:name '%t' '/home/user/thumbs/%[filename:name]_thumb.jpg' \;

答え3

ソリューションでは、ファイル名はデフォルトで分割されており、$IFSスペースが含まれています。

以下を試してください。

while IFS= read -rd '' f; do

    convert ./"$f" -resize 800x800\> ./"${f%.jpg}_thumb.jpg"
    mv ./"${f%.jpg}_thumb.jpg" /home/user/thumbs/

done < <(find . -type f -iname "*.jpg" -print0)

同じ設定の区切り文字を使用して、findヌルバイト()で区切られたファイル名を印刷します。\0-d ''read

関連情報