我正在检查目录中存在的特定文件是否早于 30 分钟。
curr_epch=`date +%s`
curr_epch_buff=`expr $curr_epch - 1800`
ls -l --time-style=+"%s" | grep .part | awk '{ if (($6 >= $curr_epch_buff)) print $6 }'
然而,无论提到的条件如何,上面的代码都会给我结果。
为了调试它,当我尝试计算这两个值之间的差异时,我也没有得到预期的结果,而是得到了6 美元正在打印,因为它是:
ls -l --time-style=+"%s" | grep .part | awk '{ print (expr $6 - $curr_epch_buff) }'
但是,如果我尝试使用上面的查询减去静态数字,它会给我预期的结果:
ls -l --time-style=+"%s" | grep .part | awk '{ print (expr $6 - 200) }'
有人可以告诉我上面提到的第一组和第二组代码有什么问题吗?
答案1
使用$(...)
而不是`...`
--参见
https://mywiki.wooledge.org/BashFAQ/082
bash 可以做算术,你不需要调用expr
.
不解析ls
curr_epch_buff=$( date -d '30 minutes ago' +%s )
for file in *.part; do
file_mtime=$( stat -c '%Y' "$file" )
if (( file_mtime < curr_epch_buff )); then
echo "$file is older than 30 minutes"
fi
done
存在的问题awk '{ print (expr $6 - $curr_epch_buff) }'
:
curr_epch_buff
被视为awk 变量。它未设置。- 在 awk 中,
$n
它的作用就像一个运算符,返回由引用的字段号的内容n
- 在数字上下文中,未设置的变量被视为数字 0
- so与整个记录
$curr_epch_buff
相同。$0
expr
也是一个未设置的变量expr $6
是字符串连接,结果是内容$6
$6 - $0
- 该记录不是以数字开头,而是以返回的文件权限字符串开头
ls -l
- awk 将不以数字开头的字符串视为零
- 该记录不是以数字开头,而是以返回的文件权限字符串开头
最终的结果就是值$6
答案2
if [ -z "$(find . -name '*.part' -mmin -30)" ]
then
echo ".part file is old"
else
echo ".part file is recent"
fir