0

我的目标是删除超过 5 天的旧文件,这些文件不再被任何进程使用。作为初学者,我编写了以下脚本,但它不起作用,说找不到第 10 行命令。

HOME=~/var

cd $HOME

for f in `find . -type f`; do
  if [`lsof -n $f`]; then

       echo $f
  fi

done
4

1 回答 1

2

嗯,它没有正确完成试试这个:

#!/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}'
于 2013-04-20T11:05:11.743 回答