当我使用它时:
*/5 6-18 * * 1-6 [ "$(ls -A /DIR_WHERE_FILES_ARE_OR_NOT/)" ] &&
rsync -au /DIR_WHERE_FILES_ARE_OR_NOT/ /DIR_WHERE_FILES_SHOLD_GO; \
mv /DIR_WHERE_FILES_ARE_OR_NOT/* /SAVE_DIR/ ||
mail -s "DIR IS EMPTY" myemail@klkldkl.de <<< "message"
我收到两封邮件:
mv:无法统计`/ DIR_WHERE_FILES_ARE_OR_NOT / *':没有此类文件或 目录
和
“DIR IS EMPTY”
为什么?
答案 0 :(得分:2)
你得到了
mv: cannot stat `/DIR_WHERE_FILES_ARE_OR_NOT/*': No such file or directory
正是由于所述原因:该目录为空,因此它不包含名为*
(星号)的文件。这就是全局扩展在shell中的工作方式:如果glob不匹配任何东西,它会直接传递给命令。由于mv
尝试重命名不存在的文件,因此会显示为抱怨。
这将更具可读性,如果不是crontab中的&&
和||
运算符序列,您可以将整个逻辑放在具有等效if/else/fi
构造的脚本中,只需从cron调用脚本。
您收到两封邮件,因为您明确发送第一封邮件mail -s
。第二个是来自cron,因为stderr和stdout上的输出不为空。
您的命令等同于
if [ "$(ls ...)" ]; then
rsync
fi
if ! mv; then
mail
fi
请注意,没有else
。
答案 1 :(得分:1)
您收到两封邮件,因为当mv
失败时,cron
会捕获写入标准错误的内容并将其邮寄给所有者,然后运行mail
命令。您可以取消mv
的错误消息,以避免来自cron
的邮件。
mv /DIR_WHERE_FILES_ARE_OR_NOT/* /SAVE_DIR/ 2> /dev/null || mail -s "DIR IS EMPTY" myemail@klkldkl.de <<< "message"
答案 2 :(得分:1)
就像用户Jens已经提到的那样,而且根据我的经验,除非你使用的是一个非常简单且通常单一的命令,否则你应该坚持使用脚本文件。所以,在你的情况下,我会使用脚本文件。我给你举个例子。
#!/bin/bash
dir_where_files_are_or_not=/filespath
dir_where_files_should_go=/another/filespath
save_dir=/savefiles/path
# ok, lets start by checking if dir contains files
if [ "$(ls -A $dir_where_files_are_or_not)" ]; then
# dir contains files, so lets rsync and mv them
rsync -au $dir_where_files_are_or_not/ $dir_where_files_should_go
mv $dir_where_files_are_or_not/* $save_dir
else
# dir is empty, lets send email
mail -s "DIR IS EMPTY" myemail@klkldkl.de <<< "message"
fi
现在,我把这段代码放在一个文件中。给它命名,例如“chkfiles”并将其保存在一个目录中(我使用/ usr / local / sbin表示我的所有脚本)。
接下来,在shell中,运行命令chmod +x /usr/local/sbin/chkfiles
以使文件可执行。然后将脚本添加到您的crontab。
我建议在crontab中使用以下行:
*/5 6-18 * * 1-6 /bin/bash /usr/local/sbin/chkfiles
我使用/ bin / bash为这个脚本调用正确的解释器。它应该按预期工作。
重要提示:
dir_where_files_are_or_not
,dir_where_files_should_go
和save_dir
vars。此致