我正在尝试编写一个脚本来检查磁盘空间,然后根据磁盘的使用百分比采取行动。如果超过阈值,我希望能够从 dailybackup 目录中删除一些文件。然而,我发现迭代该目录的内容(tar 文件)具有挑战性。关于我如何做到这一点有什么想法吗?下面是脚本目前的样子;
#!/bin/bash
#
# Drive cleanup
threshold='70'
currentDate=$(date +%F | sed 's/-//g')
currentDateClip=$(date +%F | sed 's/-//g' | cut -c 1-4)
used=$(df -h | awk '{print $4}' | sed 's/%//g' | head -3 | tail -1)
dir='~/scripts/dailybackup/*.sheldns.*'
if [ $used -ge $threshold ]
then
for FILE in $dir
local secondArg=$((basename $FILE) | cut -c 1-4)
do
if [ (expr currentDate - secondArg) -gt '400' ]
then
echo "We are good to go"
else
:
done
else
:
fi
答案1
您可能不应该引用表示您将在数学方程中使用的数字的字符串。将它们视为数字,并确保您的代码以这种方式对待它们。
当您一开始就能以正确的格式获得所需的结果时,就不要浪费太多的精力来后期处理结果。
date +%F | sed 's/-//g'
应该是公正的date +%F%m%d
。date +%F | sed 's/-//g' | cut -c 1-4
应该是公正的date +%Y
(不是 sed 不起作用,因为无论如何你都只剪掉了前四个字符)。df -h | awk '{print $4}' | sed 's/%//g' | head -3 | tail -1
应该通过多种方式简化。- 不要搞乱头/尾组合。您可以用磁盘名称来查找您想要的行,这将使在向系统添加驱动器时变得不那么脆弱。
- 无论如何,您都可以只询问
df
一个驱动器安装点的信息,因此甚至不必费心使用 grep。 - 您可以直接询问您想要的数字,而无需对一堆输出字段进行排序一位评论者为您提供了一种 with
tr
和另一种 withawk
,这里是一个 withsed
,它结合了两行输出并删除了所有不是数字的内容:df --output=pcent / | sed 'N;s/[^[:digit:]]//g'
放弃
else :
构造。这:
是一个“noop”,用于填充 else 表达式语法中命令所需的位置,但您没有在那里执行任何操作,因此根本不使用 else 表达式。你缺少一个
fi
来关闭你的 if 结构。这是一个偏好问题,但是如果您对缩进以及控制结构是否在同一行上更加有规律,那么当语法错误发生时,您就不会那么困惑。
你有一个变量赋值被困在
if
和 它相关的之间do
。它应该在它之后,因为它是您尝试运行的循环的一部分。不要使用不正确的名称来调用变量。如果变量是复数,则给它一个复数名称。如果它是文件列表,请勿将其称为“dir”。这类事情不会阻止代码运行,但会使其难以理解和调试,并且您会对代码的去向感到困惑。
不要将 shell 全局模式放入带引号的变量中。您应该让这些通过 for 循环得到扩展。这将为您避免转义包含奇怪内容(例如引号)的文件名带来的各种痛苦。
使用 bash 的双括号测试语法而不是单括号,它们对空字符串之类的东西更友好。
引用 bash 变量时,必须使用
$
前缀Bash Bath 表达式应该符合
$(( <expression> ))
语法。
考虑到所有这些注释,脚本变成这样:
#!/bin/bash
threshold=70
currentYear=$(date +%Y)
used=$(df --output=pcent / | sed 'N;s/[^[:digit:]]//g')
if [[ $used -ge $threshold ]]; then
for FILE in ~/scripts/dailybackup/*.sheldns.*; do
local fileYear=$((basename $FILE) | cut -c 1-4)
if [[ $(($currentYear - $fileYear)) -gt 400 ]]; then
echo "We are good to go"
fi
done
fi
您还可以做更多事情来简化这一过程。例如,您可以跳过数学运算,只要求以旧年份日期开头:oldDate=$(date +%Y -d '400 years ago'). This would give you a number that you could compare directly as in
[[ $fileYear -le $oldYear ]]`,这样就更容易了解发生了什么。
此外,您可能可以通过使用文件修改时间而不是尝试解析它们的名称来避免整个文件迭代过程:
#!/bin/bash
if [[ $(df --output=pcent / | tr -d "A-Za-z% \n") -ge 70 ]]; then
find ~/scripts/dailybackup/ -type f -name '*.sheldns.*' -ctime +146000 -print
fi
请注意,当您对结果感到满意时,您可以更改-print
为-delete
直接删除它找到的文件,但您还必须将 146000(400 年的天数)减少到更有可能实际匹配某些文件的值。