imagemagicks recognitionコマンドを使用して、破損したjpg画像を認識するスクリプトを作成しようとしています。スクリプトは出力で「破損した」という単語に対してgrepコマンドを実行し、ファイルが破損している場合は破損したフォルダに移動するか、ファイルが正常に表示されると入力フォルダに移動します。
端末ウィンドウでスクリプトを手動で実行すると、期待どおりに機能します。理想的には、このスクリプトをcronジョブとして実行したいのですが、cronjobで予約するとすべてが入力フォルダに移動するため、IF文が正しく評価されないようです。 cronjobとして機能するには、スクリプトで他のタスクを実行する必要がありますか?
#!/bin/bash
LANG=en_US.UTF-8
#variables for our folders
DROP_FOLDER=~/Desktop/Drop
CORRUPT_FOLDER=corrupt_images/
INPUT_FOLDER=Input/
cd $DROP_FOLDER
for f in *.jpg
do
if /opt/ImageMagick/bin/identify -verbose $f | /usr/bin/grep -iq "Corrupt"; then
mv "$f" $CORRUPT_FOLDER
else
mv "$f" $INPUT_FOLDER
fi
done
crontabでスケジュールを予約しています
*/2 * * * * cd ~ && ./myscript.sh
答え1
cronジョブとしてスクリプトを追加する場合、スクリプトを実行しているcronユーザーは、スクリプトのテストに使用できる一般ユーザーアカウントとは異なります。
その後、このコマンドが実行されたとき
DROP_FOLDER=~/Desktop/Drop
ランタイム拡張はcronユーザー(rootなど)の~
ためであるため、それを目的のディレクトリのフルパスに置き換える必要があります。$HOME
DROP_FOLDER=~/Desktop/Drop
答え2
ブロックを次に交換することをお勧めしますif
。
/opt/ImageMagick/bin/identify -verbose "$f" | /usr/bin/grep -iq "Corrupt"
if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 1 ]]; then
mv "$f" "$INPUT_FOLDER"
else
mv "$f" "$CORRUPT_FOLDER"
fi
から man bash
:
PIPESTATUS
:最後に実行されたフォアグラウンドパイプライン(単一のコマンドのみを含めることができます)のプロセスの終了ステータス値のリストを含む配列変数(以下の配列を参照)。
答え3
その条件のコマンドが期待どおりに動作しないようです。この問題をデバッグするには、Identityコマンドの出力とエラー出力をファイルにリダイレクトし、記録された内容を確認します。たとえば、次のようになります。
/opt/ImageMagick/bin/identify -verbose $f &> /tmp/debug.log
この出力を見た後は、何が起こっているのかをより明確に見ることができます。