我正在尝试编写一个脚本,使用 imagemagicks recognize 命令识别损坏的 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
运行时~
扩展为$HOME
cron 用户(即 root)的,因此您应该替换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
看到这个输出后,我们应该更清楚地看到发生了什么。