我正在编写一个脚本来检查是否确实存在一个包含内容和正常大小的目录,并查看是否有一个超过36小时的目录,如果不是,它应该提醒我。
但是我在使用目录作为变量时遇到了麻烦。
当我执行脚本时,它返回:./test.sh: line 5: 1: No such file or directory
。
我也尝试了ALLDIR=$(ls /home/customers/*/
,但又返回了同样的错误。
我做错了什么?以下是剧本。
提前多多感谢!!
#!/bin/bash
ALLDIR=$(find * /home/customers/*/ -maxdepth 2 -mindepth 2)
for DIR in ${ALLDIR}
do
if [[ $(find "$DIR" -maxdepth 1 -type d -name '*' ! -mtime -36 | wc -l = <1 ) ]]; then
mail -s "No back-ups found today at $DIR! Please check the issue!" test@example.com
exit 1
fi
done
for DIR in ${ALLDIR}
do
if [[ $(find "$DIR" -mindepth 1 -maxdepth 1 -type d -exec du -ks {} + | awk '$1 <= 50' | cut -f 2- ) ]]; then
mail -s "Backup directory size is too small for $DIR, please check the issue!" test@example.com
exit 1
fi
done
答案 0 :(得分:4)
首先,要将所有目录循环到一个固定的深度,请使用:
for dir in /home/customers/*/*/*/
以斜杠/
结尾的模式只匹配目录。
请注意$dir
是一个小写的变量名,不要使用大写的变量名,因为它们可能会与shell内部/环境变量冲突。
接下来,您的情况有点不妥 - 您不需要在此处使用[[
测试:
if ! find "$dir" -maxdepth 1 -type d ! -mtime -36 | grep -q .
如果找到任何内容,find
将打印它,grep
将安静地匹配任何内容,因此管道将成功退出。开始时!
会否定条件,因此if
分支仅在未发生这种情况时才会被采用,即未找到任何内容时。 -name '*'
是多余的。
您可以使用第二个if
执行类似操作,删除[[
和$()
并使用grep -q .
来测试任何输出。我想cut
部分也是多余的。