以下を実行する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
です。find
sh
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
答え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