我的目标是删除超过 5 天的旧文件,这些文件不再被任何进程使用。作为初学者,我编写了以下脚本,但它不起作用,说找不到第 10 行命令。
HOME=~/var
cd $HOME
for f in `find . -type f`; do
if [`lsof -n $f`]; then
echo $f
fi
done
嗯,它没有正确完成试试这个:
#!/bin/bash
DIR=$HOME/var
##########################################################
## files older than 5 days and recursive value set to 1
# for f in $(find $DIR -mtime +5 -maxdepth 1 -type f); do
##########################################################
for f in $(find $DIR -type f); do
# run lsof and look for pattern a-z send it to dev null
lsof -n $f |grep [a-z] > /dev/null
# If it was found the exit status will be 0 or success
if [ $? = 0 ]; then
echo "$f in use -->"
else
echo "File $f not in use"
fi
done
在您的脚本中,您已将 HOME 定义为 ~/var - 在脚本中使用波浪线我会尽量远离。其次,您在脚本中更改了环境变量的值。从命令行尝试
env|grep HOME
这种新方法更清洁
现在这是另一个指针,可能意味着您需要进行进一步的更改...
您的脚本会在 cron 作业中运行吗?它将作为这个现有用户的 cron 条目运行吗?如果设置为 root 运行,那么上面将失败,我将向您展示如何:
echo $HOME
/home/myuser
sudo -i
echo $HOME
/root
注意 home 的 ~ 或 $HOME 值是如何改变的。所以如果你决定将它作为另一个用户的 cron 条目运行,那么试试这个
scriptuser="your_user"
getent passwd $scriptuser|awk -F":" '{print $6}'
如果是当前用户,则 sudo su - 或 sudo -i 然后执行脚本,然后尝试:
getent passwd $(logname)|awk -F":" '{print $6}'