私は、ディレクトリ内の各ファイルに対して3つのimagemagickコマンドを実行する単純なbashシェルスクリプトを作成しました。各コマンドを同時に実行するために&または|を使用しませんでした。
#!/bin/bash
jpg="$1/*.jpg"
jpeg="$1/*.jpeg"
JPG="$1/*.JPG"
png="$1/*.png"
#convert to png
to_png() {
for file in $jpg; do mogrify -format png $file; rm $file; done
for file in $jpeg; do mogrify -format png $file; rm $file; done
for file in $JPG; do mogrify -format png $file; rm $file; done
}
#format for 4k
to_4k() {
for file in $png; do convert $file -resize 3840x2160 $file; done
}
#put on transparent background
to_trans() {
for file in $png; do composite -gravity center $file -geometry 3840x2160 /path/to/transparent/background $file; done
}
do_stuff() {
to_png
to_4k
to_trans
}
if [ -d "$1" ];
then do_stuff
else echo "You didn't enter a directory. Please try again."
fi
ディレクトリに.jpgファイルがある場合は、エラーメッセージが表示されます。 ImageMagickは、ファイルが完了する前にbashにコマンドが完了したことを伝えますか?
convert: Expected 8 bytes; found 0 bytes `/path/to/picture/image.png' @ warning/png.c/MagickPNGWarningHandler/1669.
convert: Read Exception `/path/to/picture/image.png' @ error/png.c/MagickPNGErrorHandler/1643.
convert: corrupt image `/path/to/picture/image.png' @ error/png.c/ReadPNGImage/3973.
convert: no images defined `/path/to/picture/image.png' @ error/convert.c/ConvertImageCommand/3210.
composite: Expected 8 bytes; found 0 bytes `/path/to/picture/image.png' @ warning/png.c/MagickPNGWarningHandler/1669.
コマンド間で長いスリープモードを使用すると、この問題を解決できますが、非常に粗雑です。
注:forループで$ 1 / * .jpgを使用すると、明らかに$ 1と*が拡張されないため、ディレクトリを変数に保存しています。 Bash は、/path/to/*.jpg が存在しないというエラーを返します。
私はUbuntu 16.04(x86_64)、GNU bash 4.3.48、およびImageMagick 6.8.9-9を使用しています。
ベストアンサー1
$1
内部機能は外部機能とは異なります$1
。
dir="$1"
したがって、スクリプト start: , ... に保存し、$dir
他の場所で使用する必要があります。
これにより、自分で見つけた最初の奇妙な問題(bash:パスが存在しない)を解決できますが、...おそらく他のすべての問題は解決されます。
解決策が不完全です。変数を引用符で囲む必要がありますが、グローバル拡張は間違っています...スクリプトの単純化されたバージョンは確かにうまく機能するので、コードを整理するだけです。
#!/bin/bash
shopt -s nullglob ; set -o xtrace #xtrace for debug
dir="$1" ; [ -d "$dir" ] || dir=.
for file in "$dir"/*.{jpg,jpeg,JPG}; do mogrify -format png "$file"; rm "$file"; done
for file in "$dir"/*.png; do convert "$file" -resize 3840x2160 "$file"; done
for file in "$dir"/*.png; do composite -gravity center "$file" -geometry 3840x2160 /home/d/bin/youtube_tools/4kclear.png "$file"; done